在sqlite v3中工作,我有一个需要日历表的查询,主要是将每月账单扩展到每日账单。尽管我仔细添加了索引(并使用了EXPLAIN QUERY PLAN),但它仍然太慢,无法满足我的需求。
有问题的查询基本上是:
SELECT stuff
FROM (<subquery>) AS calendar
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
GROUP BY calendar.date
其中<
子查询>
是一个漂亮的日历生成技巧,我选择了某个地方:
SELECT DATE('#{start_time.to_s(:db)}', (d4.digit * 10000 + d3.digit * 1000 + d2.digit * 100 + d1.digit * 10 + d0.digit) || ' DAYS') AS date
FROM digits AS d0
INNER JOIN digits AS d1
INNER JOIN digits AS d2
INNER JOIN digits AS d3
INNER JOIN digits AS d4
WHERE (d4.digit * 10000 + d3.digit * 1000 + d2.digit * 100 + d1.digit * 10 + d0.digit) < #{ndays}
ORDER BY date
(是的,数字表预先加载了数字0 ... 9.它如何真正起作用留给读者练习!)
我知道日历子查询很快(<50毫秒)。但是在重新阅读sqlite文档时,我理解外部查询中的GROUP BY calendar.date强制在calendar.date上生成索引。由于日历是动态生成的,因此未对其编制索引。
所以问题,总是问题:
... TIA
答案 0 :(得分:1)
你知道什么真的漂亮吗?将重要的业务数据存储在表中。
Create a calendar table,将其编入索引,使用日期填充它,然后在查询中尝试 。您的日历表可能只需要一列日期。