数以百万计的..。是否值得缓存总量或关闭NOCOUNT;而不是每次都对这么多数据进行请求?
Server 2008 R2
另外,是否只在Primary_Key上运行COUNT()语句,从而提高性能?
发布于 2011-09-01 12:02:31
NOCOUNT并不意味着“不计数”--它只是“不要报告计数”。报告可能导致服务器和客户端之间出现大量不必要的聊天(通常被忽略),并且可能被某些API错误地解释为结果集。在我以前的工作中,我们的编码策略之一是在每个过程中都需要设置NOCOUNT,我仍然把它作为最佳实践来推广。但是,有一些API依赖于此消息,实际上,您自己的.NET代码今天可能依赖于.RecordsAffected。
至于计数,您可以使用sys.dm_db_partition_stats,但要注意,这并不保证100%的准确性-就像使用NOLOCK进行直接计数一样,它不会考虑正在进行的事务。
我还对@garik的回答提出了几点改进建议:
SELECT
sch = OBJECT_SCHEMA_NAME(i),
obj = OBJECT_NAME(i),
[RowCount] = rc
FROM
(
SELECT
i = [object_id],
rc = SUM(row_count)
FROM sys.dm_db_partition_stats
WHERE index_id IN (0,1)
GROUP BY [object_id]
) AS x
ORDER BY [RowCount] DESC;这将考虑分区,包括模式和对象名称,并显式地标识堆和聚集索引(谁知道微软何时开始提供假设索引或其他系统定义的索引负index_id值)。
至于依赖主键的问题,您将不会看到COUNT(*)和COUNT(key_column)在性能上的差异--如果您检查计划,它们应该是相同的。不过,在使用COUNT(nullable_column)时要小心--我个人认为COUNT(*)更安全。也就是说,数以百万计的行,得到100%精确的计数是很少现实的要求。从上面的DMV检索行数应该是足够的,并且不可能影响表本身(或者被表上的操作减慢)。
发布于 2011-09-01 14:38:11
SET NOCOUNT ON只适用于会影响客户端服务器性能并破坏大量代码的xx rows affected。参见下面的内容:https://stackoverflow.com/questions/1483732/set-nocount-on-usage
在这里讨论了COUNT(*)和COUNT(PK):选择_非_空_列计数之间有什么区别(*)并选择计数(任意)?摘要:COUNT(*)与COUNT(pk)不同,按照ANSI标准。实际上,它们是一样的,但COUNT(PK)是一个神话
发布于 2011-09-01 10:44:17
返回没有表扫描的每个表的行计数:
SELECT OBJECT_NAME(OBJECT_ID) TableName, st.row_count
FROM sys.dm_db_partition_stats st
WHERE index_id < 2
ORDER BY st.row_count DESChttps://dba.stackexchange.com/questions/5293
复制相似问题