3

我在 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
4

1 回答 1

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 *从您的查​​询中删除了所有内容,这在生产代码中是不好的做法,我还为所有列引用添加了表名/别名的前缀,这再次保护您的查询免受未来架构的影响变化。

于 2013-04-25T08:47:20.567 回答