mssql sqlserver count(列名) count(distinct 列名) 的性能分析和对比


摘要:
下文将分析 count 在sql数据库的运行性能
实验环境:sql server 2008 R2


例:
—语句1:
select count([列名]) from [表名](nolocK)
—语句2:
select count(distinct [列名]) from [表名](nolocK)

1.分别查看两种写法所对应的执行计划

我们将以上两条sql语句,放入查询分析器中运行,可以看出,
count(distinct [列名]) 比 count([列名]) 多好多步骤,
单纯从操作步骤上可以得出count(distinct 列名) count(列名)耗资源,如下图所示:
mssql_sqlserver_count_distinct同count性能对比 mssql_sqlserver_count_distinct同count性能对比[/cap

2.分别查看两种写法对应的读取

  /*语句3 */
   DBCC FREEPROCCACHE
   DBCC DROPCLEANBUFFERS
   DBCC freesessioncache
   DBCC FREESYSTEMCACHE('All')
   go
  
   SET STATISTICS IO ON 
   SET STATISTICS TIME ON 
   go
   select count([列名]) from [表名](nolocK)

   /*语句4*/
   DBCC FREEPROCCACHE
   DBCC DROPCLEANBUFFERS
   DBCC freesessioncache
   DBCC FREESYSTEMCACHE('All')
   go
  
   SET STATISTICS IO ON 
   SET STATISTICS TIME ON 
   go
   select count(distinct [列名]) from [表名](nolocK)
   /*
   输出信息:
    语句3:
	  SQL Server 分析和编译时间: 
      CPU 时间 = 0 毫秒,占用时间 = 187 毫秒。

     (1 行受影响)
     表 '[表名]'。扫描计数 1,逻辑读取 2483 次,物理读取 51 次,预读 2483 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

      SQL Server 执行时间:
   CPU 时间 = 219 毫秒,占用时间 = 396 毫秒。
  ------------------------------------------------------------------------------  
	语句4:
	    SQL Server 分析和编译时间: 
     CPU 时间 = 15 毫秒,占用时间 = 267 毫秒。

    (1 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 '[表名]'。扫描计数 9,逻辑读取 21385 次,物理读取 551 次,预读 21385 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

 SQL Server 执行时间:
   CPU 时间 = 1547 毫秒,占用时间 = 1746 毫秒。
 ------------------------------------------------------------------------------  
   */


从以上语句可以看出:
count(distinct)需要消耗更多的CPU、内存,更多的IO读取
count(distinct [列名])的性能比count([列名]) 性能低。