2011-08-05 29 views
3

我想優化我的應用程序。我注意到cursor.movetofirst()方法以某種方式減慢了我的代碼的性能。android遊標movetofirst性能問題

Cursor cursor = myDbHelper.getDayInfo(new SimpleDateFormat("yyyy-MM-dd").format(myCalendar.getTime()); 

上面的行執行10毫秒2.1模擬器,和

if(cursor != null && cursor.moveToFirst()) 

此行歷時約1.6秒。我對此沒有太多的研究。有人說在另一個線程中或在asynctask中,但這會使代碼更復雜。 我只是想弄清楚這個遊標實際發生了什麼。 任何人都可以簡化或提供與我的問題相關的數據庫性能增加的提示嗎?

回答

0

很自然,moveToFirst()方法獲得的時間比其他代碼多得多。實際發生的數據取決於數據庫通信,數據讀取等。你實際上無法做任何事情。建議是正確的 - 將所有長期操作移至AsyncTask

+0

你是指單行查詢的所有長操作? –

+0

我覺得添加一個重要的評論後,找出原因表中有列id,foreign_id,日期和我只爲日期創建索引。但很快就意識到我已經創建了foreign_id和日期列索引。以下是查詢:CREATE INDEX idx ON mytable(foreign_id,date)。列順序很重要。 –

0

如果光標所保持的數據集很大,則移動光標需要時間。您必須在單獨的線程上執行這樣的數據密集型操作。使用AsyncTask可能會使你的代碼複雜一點,但它是值得的。這是針對用戶線程被阻止的,這是以破壞的UI體驗爲代價的。

+1

感謝快速回放,但結果數據集只是一行,但總數據庫包含數千行。我認爲這不是關於所持有的數據集。查詢返回一個包含10列的單行。 –

2

這已經有一段時間了,因爲這被標記爲回答,但你從來沒有真正在這裏得到很好的答案。即使在一個非常大的表上,單行查詢通常也會少於1.6秒。這很慢的原因是您沒有查詢的列的索引,所以它必須掃描整個表以找到這些值。如果您創建索引,則可以將時間縮短到幾分之一秒。

+0

是的,這是一段時間,但我後來創建了該列的索引,增加了我的原始數據,但沒有觀察到性能差異。也許是關於創建具有不唯一的文本列的索引邏輯。 –

+0

我同意 - 測試後添加一個索引不會減少moveToFirst()的時間 –