只是想知道你们中是否有人使用Count(1)而不是Count(*),是否在性能上有明显的差异,或者这只是过去几天养成的传统习惯?
特定的数据库是SQL Server 2005。
只是想知道你们中是否有人使用Count(1)而不是Count(*),是否在性能上有明显的差异,或者这只是过去几天养成的传统习惯?
特定的数据库是SQL Server 2005。
当前回答
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时间。
其他回答
在SQL-92标准中,COUNT(*)特别表示“表表达式的基数”(可以是基表、`VIEW、派生表、CTE等)。
我认为COUNT(*)很容易解析。使用任何其他表达式都需要解析器确保它不引用任何列(COUNT('a'),其中a是文本,COUNT(a),如果a是列,可以产生不同的结果)。
同样,COUNT(*)可以由熟悉SQL标准的程序员轻松识别,这是一种在使用多个供应商的SQL产品时非常有用的技能。
此外,在特殊情况下,SELECT COUNT(*)FROM MyPersistedTable;,其思想是DBMS可能保存表基数的统计信息。
因此,因为COUNT(1)和COUNT(*)在语义上是等价的,所以我使用COUNT(*)。
我希望优化器能够确保在奇怪的边缘情况之外没有真正的差异。
与任何事情一样,唯一真正的方法就是衡量你的具体情况。
也就是说,我一直使用COUNT(*)。
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
在SQL Server中,这些语句产生相同的计划。
与流行的观点相反,在甲骨文公司,他们也是如此。
Oracle中的SYS_GUID()是一个计算密集型函数。
在我的测试数据库中,t_even是一个包含1000000行的表
此查询:
SELECT COUNT(SYS_GUID())
FROM t_even
运行48秒,因为函数需要计算返回的每个SYS_GUID(),以确保它不是NULL。
但是,此查询:
SELECT COUNT(*)
FROM (
SELECT SYS_GUID()
FROM t_even
)
运行仅2秒,因为它甚至不尝试计算SYS_GUID()(尽管*是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时间。