我一直只使用“SELECT COUNT(1)FROM X”,但也许这不是最有效的。有什么想法吗?其他选项包括SELECT COUNT(*)或者如果自动递增(并且从不删除),则可能获取最后插入的id。
如果我只想知道桌子上是否有任何东西怎么样? (例如,计数> 0?)
答案 0 :(得分:12)
最好的方法是确保在单个列上运行SELECT COUNT
(SELECT 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秒以上。而且,它不需要考虑任何列名/密钥字段。