SQLite 优化查询
Posted
技术标签:
【中文标题】SQLite 优化查询【英文标题】:SQLite Optimize Query 【发布时间】:2013-12-20 01:16:38 【问题描述】:我在 SQLite 查询优化方面遇到了问题,它运行良好,但对于大型表,它需要太多时间,我需要一些帮助来优化它。
源表:
-------+----------+----------------
IdMain | IdParent | ColumnToUpdate
-------+----------+----------------
1 | |
2 | 1 | 999 <-- IdParent = 1 \
3 | | \
4 | 5 | 123 > DISTINCT ITEMS COUNT = 1
5 | | / IdParent = 1
6 | 1 | 999 <-- IdParent = 1 / UPDATE Row with IdMain = IdParent
7 | 4 |
8 | 3 | 456
-------+----------+----------------
要优化的查询
UPDATE Table
SET ColumnToUpdate = (SELECT DISTINCT ColumnToUpdate
FROM Table T
WHERE T.ColumnToUpdate IS NOT NULL
AND T.IdParent = Table.IdMain)
WHERE Table.ColumnToUpdate IS NULL
AND (SELECT COUNT(*) FROM (SELECT DISTINCT ColumnToUpdate
FROM Table T2
WHERE T2.ColumnToUpdate IS NOT NULL
AND T2.IdParent = Table.IdMain)) = 1 ;
预期表
-------+----------+----------------
IdMain | IdParent | ColumnToUpdate
-------+----------+----------------
1 | | 999 <-- UPDATE
2 | 1 | 999
3 | |
4 | 5 | 123
5 | |
6 | 1 | 999
7 | 4 |
8 | 3 | 456
-------+----------+----------------
伪算法
FOR Row DO
BEGIN
IF ColumnToUpdate = NULL THEN
BEGIN
// count distinct values in ColumnToUpdate
X = COUNT(DISTINCT(ColumnToUpdate(WITH IdParent = IdMain))
// update row ONLY when number of distinct count equals = 1
IF X = 1 THEN
UPDATE(ColumnToUpdate)
END
END
我尝试在源代码(当前为 Delphi)中拆分它,但它的运行速度也很慢。有什么办法可以加快速度吗?
【问题讨论】:
它们共享相似的语法(有一些例外),所以我认为有 mysql 经验的人也可以提供帮助 但是您的问题是关于性能,而不是语法。我将发布一个答案,说明我将如何在 MySQL 中编写它,但不能保证它在 SQLite 中表现良好。 我会寻求帮助的 :) 【参考方案1】:我想知道这是否会加快速度:
UPDATE Table
SET ColumnToUpdate = coalesce((SELECT ColumnToUpdate
FROM Table T
WHERE T.ColumnToUpdate IS NOT NULL AND
T.IdParent = Table.IdMain
GROUP BY ColumnToUpdate
HAVING count(*) = 1),
Table.ColumnToUpdate
)
WHERE Table.ColumnToUpdate IS NULL;
这只会执行一次子查询而不是两次。
此外,Table(IdParent, ColumnToUpdate)
上的索引也可能会提高性能。
【讨论】:
该死的,我忘记给一列添加索引,花了1个小时完成查询,添加索引后没有时间:),谢谢你提醒我:P跨度>以上是关于SQLite 优化查询的主要内容,如果未能解决你的问题,请参考以下文章