非常に近い概算 (進行中のトランザクションを無視) は次のようになります。
SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND p.index_id IN (0,1);
これは よりもはるかに速く返さCOUNT(*)
れます。また、テーブルが十分に迅速に変更されている場合、COUNT を開始したとき (およびロックが取得されたとき) と返されたとき (ロックされたとき) の間にテーブルが変更された場合、それほど正確ではありません。解放され、すべての待機中の書き込みトランザクションがテーブルへの書き込みを許可されました)、それははるかに価値がありますか? 私はそうは思わない。
カウントしたいテーブルのサブセット (たとえばWHERE some_column IS NULL
、フィルター選択されたインデックスを小さい方のセットに作成します)。したがって、これら 2 つのインデックスのいずれか:
CREATE INDEX IAmTheException ON dbo.table(some_column)
WHERE some_column IS NULL;
CREATE INDEX IAmTheRule ON dbo.table(some_column)
WHERE some_column IS NOT NULL;
次に、次を使用して同様の方法でカウントを取得できます。
SELECT SUM(p.rows) FROM sys.partitions AS p
INNER JOIN sys.tables AS t
ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes AS i
ON p.index_id = i.index_id
WHERE t.name = N'myTable'
AND s.name = N'dbo'
AND i.name = N'IAmTheException' -- or N'IAmTheRule'
AND p.index_id IN (0,1);
反対のことを知りたい場合は、上記の最初のクエリから減算するだけです。