4

我在 NET 上读到,使用案例 2 比案例 1 更快地检查表中的行数。所以我对 sys.sysindexes 中的 count(1) 和 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%

在此处输入图像描述

4

2 回答 2

1

That system table only has the total number of rows in the table. So you cannot use it if you need to count any subset (i.e. have a WHERE clause).

于 2013-04-23T09:37:36.913 回答
1

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

我试过这个,这是真的。

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

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

于 2013-04-23T13:07:08.257 回答