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