gpt4 book ai didi

sql-server-2005 - sql server 2005 中的 Count(*) 与 Count(Id)

转载 作者:行者123 更新时间:2023-12-03 13:25:24 25 4
gpt4 key购买 nike

我使用 SQL COUNT函数从表中获取总数或行数。以下两种说法有区别吗?

SELECT COUNT(*) FROM Table


SELECT COUNT(TableId) FROM Table

另外,在性能和执行时间方面有什么不同吗?

最佳答案

Thilo 准确地确定了差异... COUNT( column_name )可以返回小于 COUNT( * ) 的数字如果 column_name可以是NULL .

但是,如果我在回答您的问题时可以采取稍微不同的角度,因为您似乎专注于性能。

首先,注意发出 SELECT COUNT(*) FROM table;可能会阻止写入器,并且它也会被其他读取器/写入器阻止,除非您更改了隔离级别(下意识往往是 WITH (NOLOCK) 但我看到有希望的人最终开始相信 RCSI) .这意味着当您读取数据以获取“准确”计数时,所有这些 DML 请求都在堆积,当您最终释放所有锁时,闸门打开,一堆插入/更新/删除事件发生了,你的“准确”计数就出现了。

如果您需要在事务上绝对一致且准确的行计数(即使它仅在将数字返回给您所需的毫秒数内有效),那么 SELECT COUNT( * )是您唯一的选择。

另一方面,如果您想获得 99.9% 的准确度,最好使用如下查询:

SELECT row_count = SUM(row_count)
FROM sys.dm_db_partition_stats
WHERE [object_id] = OBJECT_ID('dbo.Table')
AND index_id IN (0,1);

( SUM 用于说明分区表 - 如果您不使用表分区,则可以将其省略。)

此 DMV 为表维护准确的行计数,但当前参与事务的行除外 - 正是这些事务将使您的 SELECT COUNT查询等待(最终在您有时间阅读之前使其不准确)。但否则这将导致比您提出的查询更快的答案,并且不亚于使用 WITH (NOLOCK) .

关于sql-server-2005 - sql server 2005 中的 Count(*) 与 Count(Id),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2219843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com