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

SQLite:检查表是否有超过x行的最快方法,sql,sqlite,Sql,Sqlite,检查SQLite表的行数是否超过100000行的最快方法是什么 测试表有26列和200000000行 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 EL

检查SQLite表的行数是否超过100000行的最快方法是什么

测试表有26列和200000000行

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
确保所选列被索引,最好是INT

SELECT COUNT(indexed_column) FROM TableName
现在,索引列部分很重要,您不想做像计数*这样的事情,而是希望尽可能具体地强制SQL使用该表中每一行都存在的索引

SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table
这不应该吗?如果超过100.000,则报告1,否则报告0。当您有很多行时,选择计数将咬您一口。它是有效的——但您要求的是sqlite中最快的方法

使用:

选择maxrowid作为行计数

正如NoLifeKing指出的,只有在没有任何删除的情况下,这种方法才能正确工作。否则它将变得不一致,并且您将拥有更高的行数,就像表中实际的行数一样

检查一下规则,Sqlite是如何创建rowid的

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

若表有一个主键id,若并没有任何索引列,我认为最快的方法是N=100000

select 1 from test1 limit 1 offset 100000;
这是因为您将只获得N+1行。没有计数,没有最大值

你可以在这里试试

-查询优化器自动选取索引列

select count(*) from (
 select top 100001 ID from T
) x
我们需要扫描索引来回答查询。这至少将索引扫描限制在前100001行。如果表格有1m行,这将节省90%的工作

在这里使用SQL Server语法-请自己翻译,因为我做不到

您可以选择一些索引列,而不是ID。我不知道优化器本身是否可以做到这一点

请注意,像查看标识或ID列值这样的聪明技巧通常不起作用


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

从表中选择计数*?选择*不是获取行计数的好主意,请使用索引字段。@ChrisBint:您将需要一个非空列上的索引,例如PK,而不仅仅是某个索引。我所知道的大多数DBMS都会自动使用这样的索引进行计数*。您的评论是否暗示SQLite没有那么聪明?问题可能是,如果这是一个表,您可以在其中删除行。如果我决定将行放入按降序ID排序的表中,该怎么办?如果行的最大id为负数怎么办;count*不像ChrisBint前面提到的那样好,因为它不能充分有效地使用索引;maxid不好,因为表可能是分段的,并且不能假设所有表都有递增的id返回所有行要比在引擎中计数慢得多。非常慢。我没有在这里安装SQLite,但是sqlfiddle SQLite.js显示偏移量比计数快得多。我不是SQLite专家,如果有人在表上测试它的总计数远远大于N,那就太好了。如果没有人会忽略您并没有返回所有行,只是返回计数,我可以稍后再做。在这种情况下,您的答案是好的,因为我们有相同的想法:正如在其他答案和评论中已经指出的,列不能为空。
select count(*) from table
select count(*) from (
 select top 100001 ID from T
) x