SQLite - 从具有日期列和逐月分组的表中选择记录

时间:2014-04-07 19:18:24

标签: sqlite

我有一个带有日期列的表格,其中日期被保存为长值,我想按月分组记录(但不是格里高利月!)并将其他列值相加。

我首先创建了一个带有两个日期列的临时表(_from和_to),其中__是一个月的第一毫秒,而_to是该月的最后一毫米。

然后我做了这样的选择:

 SELECT SUM(MY_TABLE.amount), TEMP_TABLE._from
 FROM MY_TABLE, TEMP_TABLE
 WHERE TEMP_TABLE._from <= MY_TABLE.date AND TEMP_TABLE._to >= MY_TABLE.date
 GROUP BY TEMP_TABLE._from;

MY_TABLE:    金额:我希望对每个月的值进行求和的列。    日期:每条记录的日期。

但是对于10K记录,返回结果表大约需要2秒钟,而且在我的用例中它太慢了。我需要一个更好的解决方案。

1 个答案:

答案 0 :(得分:1)

如果_from列没有索引,数据库必须将所有_from值写入临时表,以便能够对它们进行分组。 如果date列没有索引,则无法在不扫描整个表的情况下查找值。 您应该至少拥有以下indexes

CREATE INDEX Temp_Table_from ON Temp_Table(_from);
CREATE INDEX My_Table_date ON My_Table(date);

对于此特定查询,您可以使用covering indexes来提高性能:

CREATE INDEX Temp_Table_from_to ON Temp_Table(_from, _to);
CREATE INDEX My_Table_date_amount ON My_Table(date, amount);

使用EXPLAIN QUERY PLAN检查查询实际使用的索引。