简体   繁体   English

SQLite优化查询

[英]SQLite Optimize Query

I'm having trouble with SQLite query optimization, it runs fine, but for large tables it takes too much time and I need some help with optimizing it. 我在使用SQLite查询优化时遇到了麻烦,它运行良好,但是对于大型表来说,这会花费太多时间,因此我需要一些优化方面的帮助。

Source table: 来源表:

-------+----------+----------------
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        
-------+----------+----------------

Query to optimize 查询优化

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 ;

Expected table 预期表

-------+----------+----------------
IdMain | IdParent | ColumnToUpdate
-------+----------+----------------
   1   |          |     999         <-- UPDATE
   2   |    1     |     999        
   3   |          |                
   4   |    5     |     123        
   5   |          |                
   6   |    1     |     999        
   7   |    4     |                
   8   |    3     |     456        
-------+----------+----------------

Pseudo algorithm 伪算法

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

I've tried to split it up within the source code (currently Delphi) but it works slow too. 我试图将其拆分为源代码(当前为Delphi),但它的运行速度也很慢。 Is there any way to speed it up? 有什么办法可以加快速度吗?

I wonder if this might speed things up: 我想知道这是否可以加快速度:

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;

This only executes the subquery once instead of twice. 这只会执行一次子查询,而不是两次。

Also, an index on Table(IdParent, ColumnToUpdate) might also improve performance. 同样,在Table(IdParent, ColumnToUpdate)上的索引Table(IdParent, ColumnToUpdate)也可以提高性能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM