7

检查 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
4

8 回答 8

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

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

(此处使用 SQL Server 语法 - 请自行翻译,因为我做不到)。

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

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

要支持上述查询,请创建一个类型的虚拟列bit并对其进行索引。索引将非常紧凑并且扫描速度最快。

于 2013-08-05T09:00:57.177 回答
1
select count(*) from table

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

于 2013-08-05T08:57:13.077 回答
1

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

select 1 from test1 limit 1 offset 100000;

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

你可以在这里试试 sqlfiddle

于 2013-08-05T08:27:21.907 回答
1

SELECT COUNT当你有很多行时,会咬你。它有效 - 但您要求使用 sqlite 最快的方式。

利用:

SELECT max(rowid) AS rowcount

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

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

于 2013-08-05T08:14:40.010 回答
1
SELECT COUNT(indexed_column) FROM TableName

现在索引列部分是重要的事情,您不想做诸如计数 * 之类的事情,您希望尽可能具体地强制 SQL 使用该表上每一行都存在的索引。

于 2013-08-05T08:06:55.550 回答
0
select count(*) from table      
select max(id) from table  

如果表有一个主键 id,第二个

于 2013-08-05T08:17:54.360 回答
0
SELECT COUNT (Column) FROM TABLE

确保选择的列被索引,最好是 INT。

于 2013-08-05T08:06:53.500 回答
0
SELECT CASE WHEN COUNT(indexed_column) >= 100000 THEN 1 ELSE 0 END FROM table

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

于 2013-08-05T08:07:19.947 回答