我有两个正在尝试加入的大型(约 1 亿行)表。我在连接中使用的两列都有索引。选择前 1000 行需要几个小时,但完成后,SQLite Studio 报告说只需要一分钟。然后,SQLite Studio 又需要几个小时来计算我的结果的行数,如果我尝试打开另一个查询窗口,它会在这些小时内变得无响应。在整个过程中,任务管理器显示该进程大约 25% 的 CPU 使用率和 7-8 MB/s 的磁盘使用率。我还尝试选择前 10k 行,它需要 11 个小时才能完成,另外 11 个小时才能获得行数,但报告查询在 4 分钟内完成。这是查询:
Select d.PRC, s.prccd, abs(abs(d.PRC)-s.prccd), *
from dsf d
join secd.secd s
on s.datadate=d.DATE and substr(s.cusip,1,8)=d.CUSIP
where abs(abs(d.PRC)-s.prccd)>.0006
limit 10000
为什么这需要这么长时间?我知道 1 亿行很多,但是使用排序索引,不应该在线性时间内加入吗?添加索引需要几分钟而不是几小时,这应该是 O(n log n),因为它必须进行排序。我在不使用 substr() 的情况下得到相同的结果。那么为什么需要这么长时间呢?
为什么 SQLite Studio 报告它只需要一两分钟?
为什么在结果已经显示之后,SQLite Studio 需要这么长时间来计算结果行?
编辑:解释查询计划的输出
5 0 0 SCAN TABLE dsf AS d
7 0 0 SEARCH TABLE secd AS s USING INDEX secd_datadate (datadate=?)