只是想知道你们中是否有人使用Count(1)而不是Count(*),是否在性能上有明显的差异,或者这只是过去几天养成的传统习惯?
特定的数据库是SQL Server 2005。
只是想知道你们中是否有人使用Count(1)而不是Count(*),是否在性能上有明显的差异,或者这只是过去几天养成的传统习惯?
特定的数据库是SQL Server 2005。
当前回答
COUNT(1)与COUNT。关于计数空列的问题,这可以直接演示COUNT(*)和COUNT之间的差异(<somecol>)--
USE tempdb;
GO
IF OBJECT_ID( N'dbo.Blitzen', N'U') IS NOT NULL DROP TABLE dbo.Blitzen;
GO
CREATE TABLE dbo.Blitzen (ID INT NULL, Somelala CHAR(1) NULL);
INSERT dbo.Blitzen SELECT 1, 'A';
INSERT dbo.Blitzen SELECT NULL, NULL;
INSERT dbo.Blitzen SELECT NULL, 'A';
INSERT dbo.Blitzen SELECT 1, NULL;
SELECT COUNT(*), COUNT(1), COUNT(ID), COUNT(Somelala) FROM dbo.Blitzen;
GO
DROP TABLE dbo.Blitzen;
GO
其他回答
COUNT(*)和COUNT(1)在结果和性能方面是相同的。
随着这个问题一次又一次地出现,这里还有一个答案。我希望在这里为初学者添加一些关于“最佳实践”的内容。
SELECT COUNT(*)FROM something计数记录,这是一项简单的任务。
SELECT COUNT(1)FROM从某个对象中检索每条记录的1,然后对不为空的1进行计数,这实际上是对记录进行计数,只是更复杂。
话虽如此:好的dbms注意到,第二条语句将产生与第一条语句相同的计数,并相应地重新解释它,以免做不必要的工作。因此,通常这两个语句将产生相同的执行计划,并花费相同的时间。
但是,从可读性的角度来看,您应该使用第一条语句。您要计算记录,所以要计算记录而不是表达式。仅当您希望计算某个事件的非空出现时,才使用COUNT(表达式)。
SET STATISTICS TIME ON
select count(1) from MyTable (nolock) -- table containing 1 million records.
SQL Server执行时间:CPU时间=31ms,经过时间=36ms。
select count(*) from MyTable (nolock) -- table containing 1 million records.
SQL Server执行时间:CPU时间=46 ms,经过时间=37 ms。
我已经运行了数百次,每次都清除缓存。。结果随服务器负载的变化而变化,但几乎总是count(*)具有较高的cpu时间。
显然,COUNT(*)和COUNT(1)将始终返回相同的结果。因此,如果一个比另一个慢,这实际上是由于优化器错误。由于这两种形式在查询中都使用得非常频繁,所以DBMS不允许这样的错误保持不变是没有意义的。因此,您将发现两种形式的性能(可能)在所有主要的SQL DBMS中都是相同的。
没有区别。
原因:
在线书籍说“COUNT({[[ALL|DISTINCT]expression]|*})”
“1”是非空表达式:因此它与COUNT(*)相同。优化器识别它的本质:微不足道。
与EXISTS相同(SELECT*…或EXISTS(SELECT 1。。。
例子:
SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID
SELECT COUNT(*) FROM dbo.tab800krows
SELECT COUNT(*),FKID FROM dbo.tab800krows GROUP BY FKID
相同的IO,相同的计划,工作
编辑,2011年8月
DBA.SE上的类似问题。
编辑,2011年12月
ANSI-92中特别提到了COUNT(*)(查找“标量表达式125”)
案例:a) 如果指定了COUNT(*),则结果是T的基数。
也就是说,ANSI标准认为这是你的意思。由于这种迷信,RDBMS供应商已经优化了COUNT(1)。否则将按照ANSI进行评估
b) 否则,让TX是单列表,即将<value表达式>应用于T的每一行的结果以及消除空值。如果一个或多个空值消除,则引发完成条件:警告-