检查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
答案 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
- 查询优化器会自动选择索引列。