SQL Serverでレコード件数を調べる方法


テーブルのレコード件数を調べる方法としてまず思いつくのがcount関数ですが、件数が膨大なテーブルに対して実行した場合、結果が返ってくるまでに時間がかかります。

SELECT
    count(*) as [行数]
FROM
    [テーブル名]

count以外でレコード数を取得する方法について調べてみました。

sp_spaceused

システム ストアド プロシージャのsp_spaceusedを使ってレコード数を取得できます。

sp_spaceused (Transact-SQL) - SQL Server | Microsoft Docs

EXEC sp_spaceused [テーブル名]

sys.partitions

システム カタログ ビューを使用して、データベース内の全テーブルの行の概数を取得できます。

sys. partitions (Transact-sql SQL) - SQL Server | Microsoft Docs

SELECT
     obj.name as [テーブル名]
    ,sum(par.rows) as [行の概数]
FROM
    sys.objects as obj
INNER JOIN
    sys.partitions as par
    ON obj.object_id = par.object_id
WHERE
    obj.type = 'U'
    and par.index_id < 2
GROUP BY
    obj.name
ORDER BY
    obj.name

テーブルがパーティション分割されている場合、パーティションごとの行の概数も取得できます。

SELECT
     obj.name as [テーブル名]
    ,par.partition_number as [パーティション番号]
    ,par.rows as [行の概数]
FROM
    sys.objects as obj
INNER JOIN
    sys.partitions as par
    ON obj.object_id = par.object_id
WHERE
    obj.type = 'U'
    and par.index_id < 2
ORDER BY
     obj.name
    ,par.partition_number

sys.sysindexes

sys.sysindexesを使用して行数を取得もできますが、sys.sysindexesは将来サポートされなくなるようです。

sys.sysindexes (Transact-SQL) - SQL Server | Microsoft Docs

この機能は、Microsoft SQL Server の将来のバージョンで削除されます。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください

SELECT
     obj.name as [テーブル名]
    ,ind.rows as [行数]
FROM
    sys.objects as obj
INNER JOIN
    sys.sysindexes as ind
    ON obj.object_id = ind.id
WHERE
    obj.type = 'U'
    and ind.indid < 2
ORDER BY
    obj.name