2010-12-17 161 views
11

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

如果我只想知道表中是否有任何东西,那么该怎么办? (如计数> 0?)

+0

对于计数(*)vs计数(别的东西),看看(这里)[http://stackoverflow.com/questions/4437399/is-using-count-or-select-a-good-idea/ 4439459#4439459] – Ronnis 2010-12-18 16:54:45

回答

11

的最好办法是,以确保您在一列运行SELECT COUNTSELECT COUNT(*)较慢) - 但SELECT COUNT总是会得到的东西计数(数据库的最快方法优化内部查询)。

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

+0

如果在表上索引的列上选择count(columnName),则会更好。 – DwB 2010-12-17 21:28:07

+0

那么不是SELECT COUNT(1)而是SELECT COUNT(id)? – tofutim 2010-12-17 21:28:07

+0

是的 - 就像dwb说的那样,最好在索引列上做。 – girasquid 2010-12-17 21:29:20

0

我不相信你会找到一个特殊的方法。但是,您可以在主键上进行选择计数,以加快速度。

0

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

做不到这一点,从表

类型

SELECT COUNT(非空恒定值)的任何查询应该优化以避免对表中,或甚至一个索引的需要,进行扫描。理想情况下,引擎将简单地从内部元数据中返回表中已知的当前行数。否则,它只需要知道任何非NULL列的索引中的条目数(主键索引是第一个查找的位置)。

只要你介绍一个列到SELECT COUNT你所要求的发动机进行至少一次索引扫描和可能的表扫描,这会慢一些。

-1

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

这将返回的行数在上表中,这是最有效的方式我也碰到过呢。

它比select Count(1) from 'table_name'更有效(不包括单引号)

sp_spaceused可用于任何表,这是非常有用的,当该表是非常大的(几百万行),返回的行数正确的方式,而'select Count(1)'可能需要超过10秒。而且,它不需要考虑任何列名/关键字段。

+0

问题是关于SQLite,而不是SQL Server – dsz 2015-06-19 03:29:34

1

如果确定(真正确定),你从来没有从该表中删除任何行,你的表尚未与定义的无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是并且总是连续的数字。

+0

在这里你可以读一些关于依赖rowid [link](http://www.sqlabs.com/blog/2010/12/sqlite-and-unique-rowid-something-你,真的,需要到知道/) – Teolazza 2015-12-01 10:55:35

0

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

相关问题