我一直只使用“SELECT COUNT(1)FROM X”,但也许这不是最有效的。有什么想法吗?其他选项包括SELECT COUNT(*),或者如果自动递增(并且从不删除),则可能获取最后插入的ID。什么是最有效的方式来计算SQLite中的表中的行?
如果我只想知道表中是否有任何东西,那么该怎么办? (如计数> 0?)
我一直只使用“SELECT COUNT(1)FROM X”,但也许这不是最有效的。有什么想法吗?其他选项包括SELECT COUNT(*),或者如果自动递增(并且从不删除),则可能获取最后插入的ID。什么是最有效的方式来计算SQLite中的表中的行?
如果我只想知道表中是否有任何东西,那么该怎么办? (如计数> 0?)
的最好办法是,以确保您在一列运行SELECT COUNT
(SELECT COUNT(*)
较慢) - 但SELECT COUNT
总是会得到的东西计数(数据库的最快方法优化内部查询)。
如果你看看下面的评论,你可以看到为什么SELECT COUNT(1)
可能是你最好的选择参数。
我不相信你会找到一个特殊的方法。但是,您可以在主键上进行选择计数,以加快速度。
获取行计数的最快方法是直接从表元数据(如果有)中获取。不幸的是,我无法找到SQLite中提供的这种数据的参考。
做不到这一点,从表
类型
SELECT COUNT(非空恒定值)的任何查询应该优化以避免对表中,或甚至一个索引的需要,进行扫描。理想情况下,引擎将简单地从内部元数据中返回表中已知的当前行数。否则,它只需要知道任何非NULL列的索引中的条目数(主键索引是第一个查找的位置)。
只要你介绍一个列到SELECT COUNT你所要求的发动机进行至少一次索引扫描和可能的表扫描,这会慢一些。
sp_spaceused 'table_name'
(不包括单引号)
这将返回的行数在上表中,这是最有效的方式我也碰到过呢。
它比select Count(1) from 'table_name'
更有效(不包括单引号)
sp_spaceused
可用于任何表,这是非常有用的,当该表是非常大的(几百万行),返回的行数正确的方式,而'select Count(1)'
可能需要超过10秒。而且,它不需要考虑任何列名/关键字段。
问题是关于SQLite,而不是SQL Server – dsz 2015-06-19 03:29:34
如果确定(真正确定),你从来没有从该表中删除任何行,你的表尚未与定义的无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是并且总是连续的数字。
在这里你可以读一些关于依赖rowid [link](http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something-你,真的,需要到知道/) – Teolazza 2015-12-01 10:55:35
为了跟上girasquid的回答,作为一个数据点,我有一个拥有230万行的sqlite表。使用select count(*) from table
,计算行数需要3秒多。我也尝试过使用SELECT rowid FROM table
,(认为rowid是一个默认的主索引键),但那不是更快。然后我在数据库中的一个字段上做了一个索引(只是一个任意字段,但我选择了一个整数字段,因为根据以往的经验,我知道短字段的索引可能非常快,我认为索引存储了一个副本的价值在索引本身)。 SELECT my_short_field FROM table
把时间缩短到不到一秒钟。
对于计数(*)vs计数(别的东西),看看(这里)[http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459#4439459] – Ronnis 2010-12-18 16:54:45