在sqlite v3中工作,我有一个查询,它需要一个日历表,本质上是将每月账单扩展为每日账单。尽管我仔细地添加了索引(并使用了解释查询计划),但对于我的需要来说,它还是太慢了。
有关的查询实质上是:
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 ms)。但是,在重新读取sqlite时,我了解到calendar.date在外部查询中的组强制在calendar.date上生成索引。因为日历是动态生成的,所以没有索引。
所以,问题总是伴随着问题:
蒂娅..。
发布于 2011-04-18 00:55:19
你知道什么是最棒的吗?将重要的业务数据存储在表中。
Create a calendar table,索引它,填充它的日期,并尝试在您的查询。日历表可能只需要一个日期列。
https://stackoverflow.com/questions/5200529
复制相似问题