在SQLite中计算表中行的最有效方法是什么?

时间:2010-12-17 21:25:00

标签: sql sqlite

我一直只使用“SELECT COUNT(1)FROM X”,但也许这不是最有效的。有什么想法吗?其他选项包括SELECT COUNT(*)或者如果自动递增(并且从不删除),则可能获取最后插入的id。

如果我只想知道桌子上是否有任何东西怎么样? (例如,计数> 0?)

6 个答案:

答案 0 :(得分:12)

最好的方法是确保在单个列上运行SELECT COUNTSELECT COUNT(*)更慢) - 但SELECT COUNT始终是获取事物数量的最快方法(数据库在内部优化查询)。

如果你查看下面的评论,你可以看到为什么SELECT COUNT(1)可能是你最好的选择。

答案 1 :(得分:2)

为了跟进girasquid的答案,作为一个数据点,我有一个包含230万行的sqlite表。使用select count(*) from table,计算行数需要3秒钟。我也尝试使用SELECT rowid FROM table,(认为rowid是默认的主索引键),但这并不快。然后我在数据库中的一个字段上做了一个索引(只是一个任意字段,但我选择了一个整数字段,因为我从过去的经验中知道短字段上的索引可以非常快,我认为因为索引存储了一个副本索引本身的价值)。 SELECT my_short_field FROM table将时间缩短到不到一秒钟。

答案 2 :(得分:0)

我不相信你会找到一种特殊的方法。但是,您可以对主键的选择计数加快一点。

答案 3 :(得分:0)

获取行计数的最快方法是直接从表元数据中获取(如果有)。不幸的是,我找不到SQLite中可用的这类数据的参考。

失败,任何类型的查询

SELECT COUNT(非NULL常量值)FROM表

应优化以避免需要表,甚至索引扫描。理想情况下,引擎将简单地从内部元数据返回已知在表中的当前行数。如果不这样做,它只需要知道任何非NULL列的索引中的条目数(主键索引是第一个要查看的位置)。

只要在SELECT COUNT中引入一列,就会要求引擎至少执行索引扫描并可能执行表扫描,这样会慢一些。

答案 4 :(得分:0)

如果您确定(确定)您从未删除该表中的任何行,并且您的表尚未使用WITHOUT ROWID优化定义,则可以通过调用来获取行数:

select max(RowId) from table;

或者,如果您的表是循环队列,您可以使用类似

的内容
select MaxRowId - MinRowId + 1 from
  (select max(RowId) as MaxRowId from table) JOIN
  (select min(RowId) as MinRowId from table);

这真的很快(毫秒),但你必须注意,因为sqlite说行id在同一个表中的所有行中是唯一的。 SQLite没有声明行ID是并且将始终是连续的数字。

答案 5 :(得分:-1)

sp_spaceused 'table_name'(不包括单引号)

这将返回上表中的行数,这是我遇到的最有效的方式。

它比select Count(1) from 'table_name'(排除单引号)

更有效

sp_spaceused可以用于任何表,当表格特别大(数亿行)时,它非常有用,返回行数,而'select Count(1)'可能需要10秒以上。而且,它不需要考虑任何列名/密钥字段。