Android 2.3中性能问题的内部联接顺序

时间:2013-04-25 08:18:19

标签: android sql sqlite

我在Android应用程序中使用了sql select查询,在较新版本的android上运行正常,即在三星galaxy选项卡(android 4.0.3)上需要30到40秒来从sqlite数据库中检索数据,但是在旧版本的设备上Android 2.3需要18分钟来检索数据。如果我删除“由x_unitperson.UNITSEQ订购”,那么它在android 2.3上的性能不会降低。如何在不删除order by子句的情况下增加它在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

1 个答案:

答案 0 :(得分: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 *,这是生产代码中的不良做法,我还使用表名/别名为所有列引用添加了前缀,再次,这可以保护您的查询以防止未来的架构更改。