Mikael Erikssonは、最初のクエリが高速である理由を次のように説明しています。
SQLサーバーはそれを次のように最適化します:if exists(select * from BookChapters)
。したがって、テーブル内のすべての行をカウントするのではなく、1つの行の存在を探します。
他の2つのクエリでは、SQLServerは次のルールを使用します。 SELECT COUNT(*)
のようなクエリを実行するには 、SQLServerは最も狭い非クラスター化を使用します 行をカウントするためのインデックス。テーブルに非クラスター化インデックスがない場合は、テーブルをスキャンする必要があります。
また、テーブルにクラスター化がある場合 インデックスを作成すると、次のクエリを使用してさらに速くカウントを取得できます(このサイトから借用して行カウントを高速化してください!)
--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
を参照してください。別のリンクがありますなぜ私のSELECTCOUNT(*)の実行が非常に遅いのですか?別の解決策で。これは、テーブルを右クリックしてプロパティを選択したときに、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テーブルを更新する頻度によってはわずかにずれている場合がありますが、通常は適切です(または少なくとも十分に近いです)。