ミカエル・エリクソンは、最初のクエリが高速である理由怒鳴る良い説明があります。したがって、テーブルのすべての行を数える代わりに、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
ここでは別のソリューションを持つ別のリンクWhy is my SELECT COUNT(*) running so slow?です。テーブルを右クリックしてプロパティを選択すると、Microsoftが行数をすばやく表示する方法を示しています。
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
あなたが持っているテーブルの数にかかわらず、これは非常に迅速に戻ります。
あなたはまだあなたが番号を取得するために、sysindexesテーブルを使用することができますSQL 2000を使用している場合。
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
この数はわずかSQLは、sysindexesテーブルを更新する頻度に応じて、オフかもしれないが、それは通常、corrent(または少なくとも十分に近い)です。
は一般的に「選択的に言って「テーブルからCOUNT(*) - 大きなデータで大きな問題を抱えていることがあり得る;) –