gpt4 book ai didi

android - Android 2.3 中性能问题的内部连接顺序

转载 作者:太空狗 更新时间:2023-10-29 13:30:23 25 4
gpt4 key购买 nike

我在 android 应用程序中使用了 sql select 查询,它在较新版本的 android 上运行良好,即在 Samsung galaxy tab(android 4.0.3)上需要 30 到 40 秒才能从 sqlite 数据库中检索数据,但在旧版本的设备上android 2.3 需要 18 分钟来检索数据。如果我删除“order by 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

最佳答案

我对 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 * ,这在生产代码中是不好的做法,我还在所有列引用前加上一个表名称/别名,这再次保护您的查询免受 future 架构更改的影响。

关于android - Android 2.3 中性能问题的内部连接顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com