首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否使用NOCOUNT运行COUNT()语句;消耗更多

是否使用NOCOUNT运行COUNT()语句;消耗更多
EN

Database Administration用户
提问于 2011-09-01 07:27:41
回答 3查看 361关注 0票数 0

数以百万计的..。是否值得缓存总量或关闭NOCOUNT;而不是每次都对这么多数据进行请求?

Server 2008 R2

另外,是否只在Primary_Key上运行COUNT()语句,从而提高性能?

EN

回答 3

Database Administration用户

发布于 2011-09-01 12:02:31

NOCOUNT并不意味着“不计数”--它只是“不要报告计数”。报告可能导致服务器和客户端之间出现大量不必要的聊天(通常被忽略),并且可能被某些API错误地解释为结果集。在我以前的工作中,我们的编码策略之一是在每个过程中都需要设置NOCOUNT,我仍然把它作为最佳实践来推广。但是,有一些API依赖于此消息,实际上,您自己的.NET代码今天可能依赖于.RecordsAffected。

至于计数,您可以使用sys.dm_db_partition_stats,但要注意,这并不保证100%的准确性-就像使用NOLOCK进行直接计数一样,它不会考虑正在进行的事务。

我还对@garik的回答提出了几点改进建议:

代码语言:javascript
复制
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检索行数应该是足够的,并且不可能影响表本身(或者被表上的操作减慢)。

票数 7
EN

Database Administration用户

发布于 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)是一个神话

票数 3
EN

Database Administration用户

发布于 2011-09-01 10:44:17

返回没有表扫描的每个表的行计数:

代码语言:javascript
复制
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 DESC
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/5293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档