2013-04-25 26 views
3

我已經在Android應用程序中使用sql select查詢,它可以在較新版本的android上正常工作,即在Samsung galaxy選項卡(android 4.0.3)上需要30到40秒才能從數據中檢索數據sqlite數據庫,但在舊版本的android 2.3的設備上,需要18分鐘才能獲取數據。如果我刪除「order by x_unitperson.UNITSEQ」,那麼它的性能不會在android 2.3上下降。我怎樣才能提高其在android 2.3的性能,而不刪除順序的子句。在Android 2.3中的性能問題的內部連接順序

我的SQL是:

SELECT PERSON_ID, 
     COMMANDER, 
     CITIZEN, 
     RANK, 
     GIVEN, 
     SURNAME, 
     ISOR, 

    (SELECT GROUP_CONCAT(NAME_SHORT, '\n') 
    FROM units 
    INNER JOIN 
    (SELECT * 
     FROM x_unitperson 
     WHERE PERSON_ID = people.PERSON_ID 
     ORDER BY x_unitperson.UNITSEQ) AS xunits 
    WHERE units.UNIT_ID = xunits.UNIT_ID) AS NAME_SHORT, 

    (SELECT FNAME 
    FROM photos 
    WHERE PERSON_ID = People.PERSON_ID) AS FNAME 
FROM people 
ORDER BY SURNAME, 
     GIVEN 
+0

第一:嘗試拆分子選擇語句並檢查哪些需要更長的時間,「SELECT *」需要比「Select field1,field2」多一點,如果不是所有字段都需要 – 2013-04-25 08:23:17

+0

您查詢的內容相當複雜。我寧願研究一種簡化它的方法,可能會逐步加載數據。此外,您是否對此查詢運行解釋查詢計劃? – njzk2 2013-04-25 09:00:07

+1

你有這些表格的索引嗎? (指數也可以用於排序,如果我沒有記錯的話,請參閱sqlite changelog) – njzk2 2013-04-25 09:01:33

回答

2

我並不熟悉的SQLite的優化​​器,如果相關子查詢可以改寫爲加入了一些優化程序會創建兩個查詢相同的執行計劃,我不知道是否SQLite是其中之一,所以它可能是值得您的查詢轉換爲使用JOIN的,而不是相關子查詢,看它是否避免了:

SELECT people.PERSON_ID, 
     people.COMMANDER, 
     people.CITIZEN, 
     people.RANK, 
     people.GIVEN, 
     people.SURNAME, 
     people.ISOR, 
     ns.NAME_SHORT, 
     Photos.FNANE 
FROM people 
     LEFT JOIN 
     ( SELECT units.PERSON_ID, GROUP_CONCAT(NAME_SHORT, '\n') AS NAME_SHORT 
      FROM units 
        INNER JOIN 
        ( SELECT UNIT_ID, NAME_SHORT 
         FROM x_unitperson 
         ORDER BY UNIT_ID, x_unitperson.UNITSEQ 
        ) AS xunits 
         ON units.UNIT_ID = xunits.UNIT_ID 
      GROUP BY units.PERSON_ID 
     ) ns 
      ON ns.PERSON_ID = people.PERSON_ID 
     LEFT JOIN photos 
      ON photos.PERSON_ID = People.PERSON_ID 
ORDER BY people.SURNAME, people.GIVEN; 

除(使用的是什麼我可以收集有關您的架構)我已經從你的詢問中刪除了所有SELECT * y,這在生產代碼中是不好的做法,我也用表名/別名爲所有列引用加了前綴,這樣可以保護您的查詢免受未來模式更改的影響。

+0

我用自己的意見解決了它。在查詢中創建該查詢的視圖並從中撤回數據,因爲查詢中的「order by」在android 2.3.6上無法正常工作,並且花費太多時間。以上僅適用於Android的新版本,即高於2.3。 – 2013-04-26 06:01:33

+0

您應該將您的解決方案作爲答案發布並接受它,這將有助於訪問此問題的其他人遇到類似問題。 – GarethD 2013-04-26 07:47:35