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で大量レコードを持つテーブルのレコード数を取得する」の紹介でした。