SQLServerで大量レコードを持つテーブルのレコード数を取得する

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

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ