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 优化查询的主要内容,如果未能解决你的问题,请参考以下文章

sqlite 查询优化

如果可能的话,优化一个简单的 SQLite 查询!

SQLite3 数据库查询优化

SQLite 更新查询优化

sqlite如何优化第N个百分位数的查询

使用 OR 和 AND 进行 Sqlite 查询优化