0

我有一张表,里面有近 30 万条记录。我在索引列上运行带有 where 子句的简单 select 语句(“类型”被索引):

SELECT *
FROM Asset_Spec
WHERE type = 'County'

该查询很快 - 大约 1 秒。此外,我想针对状态进行测试:

SELECT *
FROM Asset_Spec
WHERE type = 'County'
AND status = 'Active'

第二个非常慢(分钟)。状态没有被索引,在这种特殊情况下,db 中 99.9% 的值是“活动的”。

有什么想法可以让我获得更好的性能吗?我们正在编译我们自己的 SQLite 版本,因此我可以调整许多设置(仅供参考 - 在 iOS 预装 SQLite 上的性能相同)

4

3 回答 3

2

我查看了查询计划,对行数的估计值相差了惊人的数量。Asset_Spec (~2 行) - 实际行数接近 300,000。Ran 'ANALYZE' - 现在相同的查询在 16 毫秒内运行。

于 2012-07-27T23:06:55.013 回答
1

我会尝试的第一件事是使用子查询

SELECT * FROM
(SELECT *
FROM Asset_Spec
WHERE type = 'County')
WHERE status = 'Active'

正如罗伯特建议的那样,在您想要过滤的任何列上添加索引是一个好主意。我还考虑将字段类型和状态更改为字符串以外的内容。

于 2012-07-27T19:07:33.637 回答
0

有什么理由需要选择 *?

建议:

您需要检索多条记录吗?如果您只需要找到的第一条记录,则将“limit 1”添加到查询的末尾。

如果你只是检查一行是否存在,即你只需要知道有一行状态为活动,那么“select 1”而不是“select *”。

于 2012-07-27T19:30:59.703 回答