gpt4 book ai didi

python - sqlite3 排序需要时间

转载 作者:行者123 更新时间:2023-12-01 05:51:26 25 4
gpt4 key购买 nike

我在 sqlite3 数据库中有位于内存映射分区上的表。我的选择语句与此查询计划如下所示:

sqlite3> EXPLAIN QUERY PLAN SELECT sst.prefix, 0 AS pb, sst.rate, 
sst.rate_n, sst.interval_1, sst.interval_n
FROM sch AS sst
WHERE
sst.i_workbook_id = 989 AND
sst.prefix IN ('', '1', '19', '191', '1919', '19198') AND
sst.activation_date <= DATETIME('now') AND
(sst.expiration_date > DATETIME('now') OR sst.expiration_date IS NULL) AND
sst.start_time <= TIME('now') AND
sst.end_time >= TIME('now');


0|0|0|SCAN TABLE sch AS sst (~185 rows)
0|0|0|EXECUTE LIST SUBQUERY 1

现在,如果我添加订单,那么他的查询计划会命中主表两次,并且花费的时间比之前长 4 倍,而表有 130 万行,但过滤的行只有两行。

这是新的查询计划:

sqlite3> EXPLAIN QUERY PLAN SELECT sst.prefix, 0 AS pb, sst.rate, 
sst.rate_n, sst.interval_1, sst.interval_n
FROM sch AS sst
WHERE
sst.i_workbook_id = 989 AND
sst.prefix IN ('', '1', '19', '191', '1919', '19198') AND
sst.activation_date <= DATETIME('now') AND
(sst.expiration_date > DATETIME('now') OR sst.expiration_date IS NULL) AND
sst.start_time <= TIME('now') AND
sst.end_time >= TIME('now') order by sst.prefix;

0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|SEARCH TABLE sch AS sst USING AUTOMATIC COVERING INDEX (i_workbook_id=?) (~7 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|SEARCH TABLE sch AS sst USING AUTOMATIC COVERING INDEX (i_workbook_id=?) (~7 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|USE TEMP B-TREE FOR ORDER BY

有什么想法吗?我做错了什么?

最佳答案

SQLite 尝试通过在 i_workbook_id 列上创建临时索引来优化第二个查询。由于无法以更好的方式优化 OR 表达式,因此会多次执行该查找。(请参阅 query optimizerquery planner 文档。)

你可以尝试做的是

  • i_workbook_id列上创建索引;或到
  • i_workbook_idprefix 列上创建索引;或到
  • 首先在这两个列上创建覆盖索引,然后在 SELECTWHERE 子句中提到的所有其他列上创建覆盖索引。

关于python - sqlite3 排序需要时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14170424/

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