― 2000万件問題を防ぐための最低限の仕組み ―
はじめに
Dr.Sum を運用していると、
- このテーブル、今どれくらい件数がある?
- 明細テーブルが 2000 万件に近づいていないか?
と気になる場面が出てきます。
SQL Server なら簡単ですが、
Dr.Sum では全テーブルの件数を自動取得できません。
そこで今回は、
制約を理解したうえで、最終的に Datalizer で件数を可視化できた方法をまとめます。
やりたかったこと
目的はシンプルです。
全テーブルのレコード件数を一覧で把握し、
2000 万件問題を事前に防ぎたい
Dr.Sum でできなかったこと
最初は
- テーブル一覧を取得
- ループして COUNT(*)
を考えましたが、Dr.Sum では
- テーブル名を動的に FROM 句に渡せない
- 動的 SQL が使えない
という制約があり、
全テーブルを自動で COUNT(*) する方法は不可能でした。
現実解:UNION ALL で件数を並べる
そこで割り切って、
- 件数が増えやすいテーブルだけを対象に
UNION ALLでCOUNT(*)を並べる
方法を採用しました。
SELECT 'テーブルA' AS テーブル名, COUNT(*) AS レコード件数 FROM テーブルA
UNION ALL
SELECT 'テーブルB', COUNT(*) FROM テーブルB;派手さはありませんが、確実に動く方法です。
View化 → Datalizer で可視化
この SQL を View 化し、
Datalizer から一覧表示できるようにしました。
結果として、
- 件数の多い順に並べる
- 明細テーブルだけ確認する
- CSV出力する
といった運用が簡単にできるようになりました。
2000 万件問題が発生する条件
Dr.Sum の 2000 万件問題は、次の 3 条件が揃ったときに発生します。
- 件数制限のあるライセンスを利用している
例:M100(1テーブル最大 2,000 万件) - 1 テーブルのレコード件数が上限に到達・超過している
- レコードが増える書き込み処理を実行した
(インポート、INSERT など)
この状態で処理を行うと、
エラーコード:0x80004501
最大登録件数を超えました。が発生し、データが入らなくなります。
※ SELECT や Datalizer の表示は可能ですが、更新は止まります。
なぜ可視化が重要か
- 2000 万件に 事前警告は出ない
- 超えた瞬間に 処理が止まる
- 止まってからの対応は影響が大きい
そのため、
1500 万件あたりから件数を把握できる状態を作ること
が重要でした。
まとめ
- Dr.Sum では全テーブルの件数を自動取得できない
- 制約を受け入れ、UNION ALL で件数を取得
- View 化して Datalizer で可視化
- 2000 万件問題は「見えていれば防げる」
結果として、
「結局、Datalizerで見えるようにしたのが一番良かった」
という結論に落ち着きました。


コメント