1. 導入
データベース管理者(DBA)として現場で頻繁に見かけるのが、効率の悪いINSERT文によるパフォーマンス低下です。INSERTは単にデータを追加するだけの単純な命令に見えますが、大量データを扱う場合、書き方ひとつでシステムの負荷や処理速度が劇的に変わります。本稿では、実務で必須となるINSERT文の効率的な使い方を整理し、現場で役立つTipsを紹介します。
2. 基礎知識
INSERT文は、テーブルに新しい行を追加するためのSQLコマンドです。
カラム指定の有無が重要なポイントとなります。
- カラムを省略する場合: テーブル定義の全カラムに対して値を指定する必要があります。
- カラムを指定する場合: 特定の列だけに値を入れ、省略した列にはデフォルト値(NULLなど)が自動的に適用されます。
初心者が陥りがちなミスは、テーブル定義を変更した際に、カラム省略型のINSERT文が動作しなくなることです。実務では、保守性を高めるために原則としてカラム名を明示的に記述することを強く推奨します。
3. 実装/解決策
実務でのポイントは「通信コストの削減」と「デフォルト値の活用」です。
特に複数のデータを一度に登録する場合、1行ずつINSERT文を発行すると、その都度ネットワーク通信が発生し、パフォーマンスが著しく低下します。これを防ぐために「バルクインサート(一括追加)」を積極的に活用しましょう。
4. サンプルプログラム
以下のコードは、実務でよく利用される「一括追加」と「式を利用した値の算出」の例です。
/ ユーザーテーブルの作成 /
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
base_salary INT,
bonus INT,
total_payment INT
);
/
複数のデータをまとめて追加(バルクインサート)
ネットワーク通信回数を減らし、パフォーマンスを向上させる
/
INSERT INTO employees (id, name, base_salary, bonus, total_payment)
VALUES
(1, ‘Tanaka’, 300000, 50000, 350000),
(2, ‘Sato’, 320000, 60000, 380000),
(3, ‘Ito’, 280000, 40000, 320000);
/
式を利用した追加
計算処理をDB側で行うことで、アプリケーション側のロジックを簡潔にする
/
INSERT INTO employees (id, name, base_salary, bonus, total_payment)
VALUES (4, ‘Suzuki’, 300000, 50000, (base_salary + bonus));
/ 結果の確認 /
SELECT FROM employees;
5. 応用・注意点
現場でトラブルを避けるための重要な注意点は以下の通りです。
・DEFAULTキーワードの活用
テーブル設計で「NOT NULLかつデフォルト値あり」のカラムを扱う際、明示的にDEFAULTを指定することで、可読性が向上します。
例: INSERT INTO employees (id, name) VALUES (5, ‘Yamada’, DEFAULT);
・デッドロックとトランザクション
一括追加を行う場合、データ数が数万件を超えるとトランザクションログが肥大化したり、テーブルロック時間が長くなり他のクエリを阻害したりする恐れがあります。大量データを投入する場合は、適度な件数(例:1,000件〜5,000件ごと)でコミットを分ける運用を検討してください。
・エラーハンドリング
「INSERT IGNORE」や「ON DUPLICATE KEY UPDATE」といった構文を併用することで、重複キーエラーが発生した際の挙動(スキップするか、既存データを更新するか)を制御できます。これらを適切に使い分けることが、堅牢なシステム構築への第一歩です。

コメント