如何优化删除日期范围where子句?

时间:2010-07-14 01:46:41

标签: android sqlite indexing date-range

我创建了一个Android应用程序,并且有一个定期删除旧记录的功能

delete from tablea where col1 = 'value1' and col2 = 'value2' and postdate < '2010-06-14'

当tablea中的行总数超过50,000时,会出现性能问题。删除500条记录大约需要45秒。

我已经有了这个where子句的索引:

CREATE INDEX indexa on tablea (col1, col2, postdate)

添加PRAGMA synchronous = OFF和PRAGMA count_changes = OFF没有帮助。

请告知

2 个答案:

答案 0 :(得分:1)

检查您的postdate字段的类型。 SELECT typeof(postdate)。看起来SQLite会根据你的where子句将其视为TEXT。 SQLite没有“日期”类型的概念,只有NUMERIC亲和力才会发生在任何“日期”上。如果你没有插入NUMERIC,那么它可能正在进行字符串比较,这将比你期望的整数比较慢。如果要插入NUMERIC s,那么where子句可能会导致它们首先被强制转换为TEXT,然后应用where子句条件。

您可以查看documentation about datatypes

答案 1 :(得分:0)

在我看来,好像你的索引没有写好。我想你想要:

CREATE INDEX indexa on tablea (col1, col2)
CREATE INDEX indexb on tablea (postdate)

正如所读,我对文档的解释说,为了弄清楚你的例子中引用了哪一行,数据库需要有一个特定的日期来匹配给定的一对值(所以它可以查找索引/索引)。您没有具体的日期。相反,你正在寻找一系列日期值。

问题是日期值的可比性是否包含在您创建的组合索引中,因此您无法轻易获得该信息,这使得索引的使用受到限制。

当然,我可以充满它。我的主要经验不是sqlite。尽管如此,尝试上述情况不应该太大。