Mikael Eriksson は、最初のクエリが高速である理由を次のように説明しています。
SQL サーバーは次のように最適化します
if exists(select * from BookChapters)
。そのため、テーブル内のすべての行をカウントするのではなく、1 つの行の存在を探します。
他の 2 つのクエリについては、SQL Server は次のルールを使用します。のようなクエリを実行するためにSELECT COUNT(*)
、SQL Server は最も狭い
非クラスター化インデックスを使用して行をカウントします。テーブルに非クラスター化インデックスがない場合は、テーブルをスキャンする必要があります。
また、テーブルにクラスター化インデックスがある場合は、次のクエリを使用してさらに高速にカウントを取得できます (このサイトGet Row Counts Fast!から借用) 。
--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
sysindexes システム テーブルを使用します。ここで見つけることができる詳細情報SQL Server 2000、SQL Server 2005、SQL Server 2008、SQL Server 2012
ここに別のリンクがあります SELECT COUNT(*) の実行が遅いのはなぜですか? 別の解決策で。テーブルを右クリックしてプロパティを選択すると、Microsoft が行数をすばやく表示するために使用する手法を示しています。
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
テーブルの数に関係なく、これは非常に迅速に返されることがわかります。
まだ SQL 2000 を使用している場合は、sysindexes テーブルを使用して番号を取得できます。
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
この数値は、SQL が sysindexes テーブルを更新する頻度によってはわずかにずれている可能性がありますが、通常は正しい (または少なくとも十分に近い) ものです。