0

我创建了一个 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 没有帮助。

请指教

4

2 回答 2

1

检查您的 postdate 字段的类型。SELECT typeof(postdate). 看起来 SQLite 会TEXT根据你的 where 子句来处理它。SQLite 没有“日期”类型的概念,只有NUMERIC任何“日期”都会发生关联。如果您没有插入NUMERICs 那么它可能会进行字符串比较,这将比您期望的整数比较慢。如果您要插入NUMERICs,那么您的 where 子句可能会导致它们首先被强制转换TEXT,然后再应用 where 子句标准。

您可以查看有关数据类型的文档

于 2010-07-14T04:59:31.733 回答
0

在我看来,您的索引在编写时似乎没有用。我想你会想要:

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

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

问题是日期值的可比性包含在您创建的组合索引中,因此您不能很容易地获取该信息,这使得索引的使用受到限制。

当然,我可以充满它。我的主要经验不是 sqlite。尽管如此,尝试上述方法应该不会有太大的伤害。

于 2010-07-14T02:40:02.627 回答