正确使用SQL Server中的count()函数

来源:互联网 发布:台湾驱动透视源码 编辑:程序博客网 时间:2024/04/30 03:56

目录

    • 目录
    • count函数的正确使用
    • 使用兼容性视图替换count函数
    • 参考资料

count()函数的正确使用

count()函数用于统计SQL Server表中的记录行。但是当表中存在NULL的内容时,那么如下3种写法的结果将不一样:

select count(*)
select count(1)
select count(列名)

我们创建一个表,然后循环插入5000条记录,并做查询对比

--创建一个test表CREATE TABLE test (    id UNIQUEIDENTIFIER DEFAULT NEWID() NOT NULL PRIMARY KEY CLUSTERED,    sequence INT NOT NULL,    data CHAR(50) NOT NULL DEFAULT '',    data_null CHAR(50));--循环插入5000条记录--注意:--  data字段填充了''--  data_null字段填充了NULLSET NOCOUNT ON    DECLARE @i INT;    SET @i = 0;    WHILE @i < 5000    BEGIN        INSERT test (sequence)            VALUES (@i);        SET @i = @i + 1;    END;    GO

我们使用上述3种写法分别统计这个表的记录数:

SELECT    COUNT(*),    COUNT(4),    COUNT(t.data),    COUNT(t.data_null)FROM test t

如下所示,count(t.data_null)显示为0,即select count(列名)将过滤NULL的记录:
这里写图片描述

同时可见,count(*)/count(4)的写法等价。

使用兼容性视图替换count()函数

当SQL Server记录行在百万或上千万时,使用count()函数可能需耗时2~3秒或更长时间,这将出现短暂的锁表。那么对于聚集索引表我们可使用兼容性视图中的sys.sysindexes进行高效的查询(如下SQL对堆表同样适用)

SELECT    rowcntFROM sys.sysindexes sWHERE id = OBJECT_ID('test')AND s.indid < 2 

其中s.indid的含义如下:

0 = Heap1 = Clustered index>1 = Nonclustered index

另需注意这个兼容性视图无法过滤记录行,只能返回表的总记录数

参考资料

COUNT (Transact-SQL)
https://msdn.microsoft.com/en-us/library/ms175997%28v=sql.100%29.aspx

2 0
原创粉丝点击