SQLServerで大量レコードを持つテーブルのレコード数を取得する
1000万件以上のレコードを持つテーブルのレコード数を高速で取得する方法を紹介します。
コーディング例
BEGIN
SET NOCOUNT ON;
-- 大量レコードを持つテーブルを作成
DECLARE @RecCnt INT = 1;
DECLARE @MaxCnt INT = 12345678;
DECLARE @RecordCount INT = 0;
CREATE TABLE TBL(
No INT
);
WHILE @RecCnt <= @MaxCnt
BEGIN
WITH
TMP AS (
SELECT
@RecCnt AS No
UNION ALL
SELECT
No + 1
FROM
TMP
WHERE
No < (CASE WHEN @MaxCnt < (@RecCnt + 100 - 1) THEN @MaxCnt ELSE (@RecCnt + 100 - 1) END)
)
INSERT INTO TBL
SELECT * FROM TMP
;
SET @RecCnt += @@ROWCOUNT;
PRINT '追加件数:' + FORMAT(@RecCnt - 1,'#,##0');
END
-- レコード件数を取得
SELECT
@RecordCount = IDX.rows
FROM
sysindexes IDX
INNER JOIN
sysobjects OBJ
ON IDX.id = OBJ.id
WHERE
OBJ.xtype = 'U'
AND IDX.indid < 2
AND OBJ.name = 'TBL'
;
SELECT @RecordCount AS RecordCount;
DROP TABLE TBL;
END
実行結果
| RecordCount |
|---|
| 12345678 |
レコード数を取得する場合は通常「SELECT COUNT(*) FROM TBL」のように記述しますが、36行目~47行目ではカタログビューと呼ばれるsysindexsやsysobjectsよりテーブルのレコード数を取得しています。
sysobjectsやsysindexsの方がレコード数が少ないので高速にレコード数を取得できます。
また、補足として5行目~33行目でテストデータを作成していますが、少しややこしいことをしています。
15行目~26行目では再帰的WITH問合せで連番のレコードを生成していますが、この問合せでは101レコードが限界になります。
よって100レコードずつ追加しています。
以上、「SQLServerで大量レコードを持つテーブルのレコード数を取得する」の紹介でした。







