技术开发 频道

加速SQL Server 2005中的表计数性能

 例2:

SELECT top 5 TABLE_SCHEMA, TABLE_NAME, (TABLE_SCHEMA +'.'+TABLE_NAME) 'Full table name',
dbo.row_count(TABLE_SCHEMA
+'.'+TABLE_NAME) rows
FROM INFORMATION_SCHEMA.TABLES
where TABLE_TYPE ='BASE TABLE'
ORDER BY rows desc
 

  查询结果如下表:
 
 
  
  表1
 
  通过增加/删除行、截取表、批量插入/批量删除等操作详细的测试该函数,返回的结果与count(*)完全一致。
 
  3.性能评测
 
  我们将通过执行批处理命令来对比count(*)和用户自定义函数row_count的性能,如下代码所示:
 
select dbo.row_count ('Sales.SalesOrderDetail')
go
select count (*) from Sales.SalesOrderDetail
go

  当查看执行计划时,我们发现第一个查询(row_count)的开销只占整个批处理开销的7%,用于此操作以及同一子树内此操作之前的所有操作的总开销只有0.03,如下图所示:


图2

  而第二个查询(count(*))的开销则占整个批处理开销的93%,用于此操作以及同一子树内此操作之前的所有操作的总开销则为0.37,如下图所示:


图3 

  毫无疑问,用户自定义函数row_count()的性能是最好的,它占用了数据库极少的资源。两者的开销比例是93:7,这意味着row_count的性能比count(*)的性能高10倍多。
 
  根据数据表的记录数不同,该对比结果可能会有所不同,但是总体来说,我们已经从中看出,新用户自定义函数要比count(*)函数好得多。在你需要获得整个表的记录数时,这个用户自定义函数可以大大提高你的查询语句性能。
 
  4.结论
 
  SQL Server 2005的内置函数count(*)在获得整个表的记录数时非常耗时,尤其对于具有数百万条记录的表时更是如此。
 
  通过用户自定义函数“row_count”这个新方法,同样可以获得准确的结果,而且速度更快,可以获得更高的性能。
 
  该函数可以在SQL Server 2005中使用,因为这些视图只有从这个版本才开始增加。
 
  http://www.sql-server-performance.com/articles/per/Speeding_up_the_Performance_of_Table_Counts_p1.aspx
0
相关文章