select count(1)vs从sysindexes中选择rowcnt的性能和使用?

时间:2013-04-23 09:34:48

标签: sql sql-server performance sql-server-2008

我在NET上读到,使用案例2比案例1更快,以检查表中没有行。 所以我发现了sys.sysindexes中count(1)vs rowcnt的性能测试 第二个好多了。

我有一个问题是,无论何时需要,都可以在生产代码中使用CASE 2 要计算存储过程或临时查询中表中的行数,是否有任何机会 案件2可能会失败吗?

编辑:在这种情况下表中的行数近20000

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

--CASE 1
SELECT count(1) from Sales.Customer c -- 95%

--CASE 2
SELECT rowcnt
from sys.sysindexes s
WHERE id=object_id('Sales.Customer') AND s.indid < 2 -- 5%

enter image description here

2 个答案:

答案 0 :(得分:1)

该系统表仅包含表中的总行数。因此,如果需要计算任何子集(即具有WHERE子句),则不能使用它。

答案 1 :(得分:1)

根据此http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/9c576d2b-4a4e-4274-8986-dcc644542a65/,它反映了未提交的数据。

我试过这个,这是真的。

当您打开事务时,如果您没有使用其中一个快照隔离级别,则count(*)将阻止,否则它将为您提供正确的,已提交的值。

除此之外,它应该没问题,处理批量负载等。