Thilo はその違いを正確に突き止めました... COUNT( column_name )
COUNT( * )
より小さい数値を返すことができます if 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)
を使用するよりも正確です。 .