SQLite:检查表是否超过x行的最快方法

时间:2013-08-05 08:03:40

标签: sql sqlite

检查SQLite表是否超过100,000行的最快方法是什么?


测试表有26列和200,000,000行。

SELECT COUNT(*) FROM ( SELECT * FROM table LIMIT 100001 )

耗时0.27秒。

以下三个需要12分半

SELECT COUNT(*) FROM table
SELECT COUNT(*) FROM table LIMIT 100001
SELECT CASE WHEN COUNT(Id) >= 100000 THEN 1 ELSE 0 END FROM table

8 个答案:

答案 0 :(得分:3)

select count(*) from (
 select top 100001 ID from T
) x

我们需要扫描索引来回答查询。这至少将索引扫描限制为前100001行。如果表格有1米的行,这可以节省90%的工作量。

(在这里使用SQL Server语法 - 请自行翻译,因为我不能这样做。)

您可以选择一些索引列,而不是ID。我不知道优化器是否可以自己做。

注意,像查看身份或ID列值这样的聪明技巧通常不起作用。

要支持上述查询,请创建类型为bit的虚拟列并将其编入索引。索引非常紧凑,扫描速度最快。

答案 1 :(得分:1)

SELECT COUNT(indexed_column) FROM TableName

现在索引列部分是重要的,你不想做像计数*这样的事情,你希望尽可能具体,强制SQL使用该表中每一行的现有索引。 / p>

答案 2 :(得分:1)

当你有很多行时,

SELECT COUNT会咬你。它有效 - 但你要求在sqlite中使用最快的方法。

使用:

SELECT max(rowid) AS rowcount

正如NoLifeKing所指出的,如果你没有任何删除,这只能正常工作。否则它会变得不一致,你会有更高的行数,就像表中的实际行数一样。

查看有关规则的http://www.sqlite.org/autoinc.html,以及Sqlite如何创建rowid。

答案 3 :(得分:1)

如果您没有任何索引列,我认为最快的方式是(对于N = 100000)

select 1 from test1 limit 1 offset 100000;

这是因为你只会获得N + 1行。没有计数,没有最大值

你可以在这里试试sqlfiddle

答案 4 :(得分:0)

SELECT COUNT (Column) FROM TABLE

确保所选列已编入索引,最好是INT。

答案 5 :(得分:0)

SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table

不应该这样做吗?如果超过100.000则报告1,否则为

答案 6 :(得分:0)

select count(*) from table      
select max(id) from table  

如果表具有主键ID,则第二个

答案 7 :(得分:0)

select count(*) from table

- 查询优化器会自动选择索引列。