我在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%
答案 0 :(得分:1)
该系统表仅包含表中的总行数。因此,如果需要计算任何子集(即具有WHERE子句),则不能使用它。
答案 1 :(得分:1)
根据此http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/9c576d2b-4a4e-4274-8986-dcc644542a65/,它反映了未提交的数据。
我试过这个,这是真的。
当您打开事务时,如果您没有使用其中一个快照隔离级别,则count(*)
将阻止,否则它将为您提供正确的,已提交的值。
除此之外,它应该没问题,处理批量负载等。