But that should effect both the UI thread query and the worker thread query. But only one runs slow.
On Wednesday, March 21, 2012 7:11:43 PM UTC+8, Mark Murphy (a Commons Guy) wrote: > > Also, bear in mind that on 2.2 and below (and some 2.3 devices), we > are dealing with the YAFFS2 filesystem, so if some other app is doing > a bunch of disk I/O, you may be blocked by their work. > > On Wed, Mar 21, 2012 at 3:22 AM, Zsolt Vasvari <[email protected]> wrote: > > Actually, just to respond to myself -- I don't believe this a SQLite > issue. > > > > For this only happens on the one query that runs in the AsyncTask. > > > > I run the exact same query twice in parallel: once in the UI thread (I > know > > I shouldn't, but it's fast) and then I run it again in the AsyncTask, > this > > time reading through the entire cursor to find a particular row index. > (Is > > there a faster way to do that in SQL, btw?). > > > > Anyway, the first query runs quick, the second one has this problem the > OP > > saw for a couple of users. Since the query is the same in both cases, I > > think this is a thread starvation issue instead of a SQLite query > problem. > > That's just my hunch based on 20 years of development experience. > > > > > > > > > > On Wednesday, March 21, 2012 2:28:46 PM UTC+8, Zsolt Vasvari wrote: > >> > >> I have 2 users (out of thousands) reporting this problem. I am at a > loss > >> as to why this is happening, also. It doesn't have anything to the > data as > >> the user claims they few rows. I even had them recreate their database > (I > >> have a backup facility that that backs up/restores from JSON) and the > >> problem still occurs. > >> > >> One guy took the phone back because he suspected a hardware issue. The > >> other person never followed up, so I don't know if he solved it or what. > >> > >> > >> > >> On Wednesday, March 21, 2012 6:54:30 AM UTC+8, Dianne Hackborn wrote: > >>> > >>> You can get the SQLite version to perform acceptably. You just need to > >>> use it correctly -- set up indices as appropriate as needed for joins > and > >>> such. I am not a SQL (lite or otherwise) expect in any way so I can't > help > >>> you with the particulars, but at the very least make sure you are > actually > >>> setting indices on the columns that are involved in deciding what rows > are > >>> included in the query result. > >>> > >>> Also all you are doing by putting your query in the main thread of your > >>> process is causing your process to ANR when it takes a long time. The > query > >>> all happens in native code down in SQLite, so you won't see anything > in your > >>> java traces (nor typically anything interesting in native traces either > >>> since most likely, yes, you are executing the query in SQLite). > >>> > >>> On Tue, Mar 20, 2012 at 3:22 PM, momo <[email protected]> wrote: > >>>> > >>>> I'm rewriting a simple translation app with a SQLite db. There is an > >>>> extreme hit to performance between two queries, but only on certain > devices. > >>>> > >>>> One query lists the english words in a ListView, the other lists the > >>>> secondary language in a list view. The data is structured > differently, and > >>>> is from a remote server. > >>>> > >>>> Both are single SQL statements, run via db.rawQuery. Both use > AsyncTask > >>>> to keep heavy lifting in another thread. > >>>> > >>>> On both devices, the "english" query returns almost instantly (less > than > >>>> 1 second, every time): > >>>> > >>>> return db.rawQuery("select _id as id, english as label from > >>>> english_words order by english collate nocase", null); > >>>> > >>>> On one device, the "secondary_langauge" query returns almost instantly > >>>> as well. No problem there, ever. This is a Samsung Galaxy SII. On > another > >>>> device (Samsung Nexus S), this query takes around 30 seconds. This > query > >>>> has some joins, as follows: > >>>> > >>>> return db.rawQuery("select definitions._id as id, secondary_language > as > >>>> label from english_words join definition_bridge on > >>>> english_words._id=definition_bridge.word_id join definitions on > >>>> definitions._id=definition_bridge.definition_id order by > >>>> secondary_language", null); > >>>> > >>>> I ran it in the emulator once, and got the same result as the Nexus S > >>>> (the 30 second hang). It took a little 1.5 hours to download and > parse the > >>>> returns from the server on the emulator (which takes a few seconds on > either > >>>> device), so I gave up on further debug with the emulator at that > point. > >>>> > >>>> This is the only difference between the two operations. The listView > is > >>>> the same, the adapter is the same, the AsyncTask is the same. The > number of > >>>> rows returned is different - there are about 2000 english words, and a > >>>> little over 3000 words in the other language. I don't think this > explains > >>>> the vast difference in performance. > >>>> > >>>> I took the query out of the AsyncTask to see if I could get some more > >>>> debug info, and did get an ANR: > >>>> > >>>> at android.database.sqlite.SQLiteQuery.native_fill_window(Native > >>>> Method) > >>>> at > android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:73) > >>>> at > >>>> android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:287) > >>>> at > >>>> android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:268) > >>>> at > >>>> > com.whatever.adapters.WordListAdapter.getCount(WordListAdapter.java:39) > >>>> > >>>> I rewrote the adapter's getCount method to return a cached count > >>>> (determined during instantiation). After, I didn't get an ANR again, > but > >>>> otherwise the performance was not improved and the query still took > around > >>>> 30 seconds. > >>>> > >>>> I'm totally at a loss. As mentioned, everything but the queries is > >>>> identical. And on the Galaxy SII, there is no problem at all - less > than a > >>>> second to populate the ListView, even under abuse (touching the > button that > >>>> launches the request as fast as I could). > >>>> > >>>> At this point, I'm wondering if it'd be better to abandon SQLite > >>>> entirely, and using a Java model to manage data. Assuming I can't > get the > >>>> SQLite version to perform reasonably, what could I expect in terms of > >>>> performance using Collections (with the number of entries mentioned > above), > >>>> when I need to do a search for example (which I imaging would require > >>>> iterating over the whole thing on each key event). > >>>> > >>>> Any advice? > >>>> > >>>> TYIA. > >>>> > >>>> -- > >>>> You received this message because you are subscribed to the Google > >>>> Groups "Android Developers" group. > >>>> To post to this group, send email to > [email protected] > >>>> To unsubscribe from this group, send email to > >>>> [email protected] > >>>> For more options, visit this group at > >>>> http://groups.google.com/group/android-developers?hl=en > >>> > >>> > >>> > >>> > >>> -- > >>> Dianne Hackborn > >>> Android framework engineer > >>> [email protected] > >>> > >>> Note: please don't send private questions to me, as I don't have time > to > >>> provide private support, and so won't reply to such e-mails. All such > >>> questions should be posted on public forums, where I and others can > see and > >>> answer them. > >>> > > -- > > You received this message because you are subscribed to the Google > > Groups "Android Developers" group. > > To post to this group, send email to [email protected] > > To unsubscribe from this group, send email to > > [email protected] > > For more options, visit this group at > > http://groups.google.com/group/android-developers?hl=en > > -- > Mark Murphy (a Commons Guy) > http://commonsware.com | http://github.com/commonsguy > http://commonsware.com/blog | http://twitter.com/commonsguy > > Android App Developer Books: http://commonsware.com/books > > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

