パフォーマンス向上: BULK INSERTで大量のデータを高速挿入
SQLクエリ1つで複数行を挿入する
SQL Server、T-SQL を使用して、1つの INSERT ステートメントで複数の行を挿入する方法について説明します。
方法
以下の3つの方法があります。
VALUES 句の繰り返し
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (値1-1, 値1-2, ...),
(値2-1, 値2-2, ...),
(値3-1, 値3-2, ...);
例
INSERT INTO 顧客 (名前, 年齢, 性別)
VALUES ('田中太郎', 25, '男'),
('佐藤花子', 30, '女'),
('斎藤健', 20, '男');
SELECT ステートメントの利用
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
SELECT カラム名1, カラム名2, ...
FROM 別テーブル名;
INSERT INTO 顧客 (名前, 年齢, 性別)
SELECT 名前, 年齢, 性別
FROM 顧客候補;
INSERT INTO ... SELECT ... (CTE)
WITH 新規顧客 AS (
SELECT '田中太郎' AS 名前, 25 AS 年齢, '男' AS 性別
UNION ALL
SELECT '佐藤花子', 30, '女'
UNION ALL
SELECT '斎藤健', 20, '男'
)
INSERT INTO 顧客 (名前, 年齢, 性別)
SELECT *
FROM 新規顧客;
この例では、CTE (Common Table Expression) を使用して、挿入するデータのセットを定義しています。
BULK INSERT
大量のデータを挿入する場合、BULK INSERT を使用できます。
注意事項
- 挿入する行数に制限はありませんが、データベースの容量やパフォーマンスに影響を与える可能性があります。
- すべての列に値を指定する必要があります。
- データ型が一致していることを確認する必要があります。
- 上記以外にも、いくつかの方法があります。
補足
- VALUES 句の繰り返しは、最も簡単な方法ですが、行数が多い場合は冗長になります。
- SELECT ステートメントの利用は、別のテーブルからデータを取得する場合に便利です。
- INSERT INTO ... SELECT ... (CTE) は、より複雑なデータセットを挿入する場合に便利です。
- BULK INSERT は、大量のデータを挿入する場合に最も効率的な方法です。
注意
- 上記の情報は参考用です。実際の使用前に、データベースのドキュメントを参照してください。
INSERT INTO 顧客 (名前, 年齢, 性別)
VALUES ('田中太郎', 25, '男'),
('佐藤花子', 30, '女'),
('斎藤健', 20, '男');
INSERT INTO 顧客 (名前, 年齢, 性別)
SELECT 名前, 年齢, 性別
FROM 顧客候補;
WITH 新規顧客 AS (
SELECT '田中太郎' AS 名前, 25 AS 年齢, '男' AS 性別
UNION ALL
SELECT '佐藤花子', 30, '女'
UNION ALL
SELECT '斎藤健', 20, '男'
)
INSERT INTO 顧客 (名前, 年齢, 性別)
SELECT *
FROM 新規顧客;
BULK INSERT 顧客
FROM 'C:\data\customers.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');
- 上記のサンプルコードは、SQL Server で動作します。
- 他の方言では、構文が異なる場合があります。
他の方法
DECLARE @i INT
SET @i = 1
WHILE @i <= 3
BEGIN
INSERT INTO 顧客 (名前, 年齢, 性別)
VALUES ('田中' + CAST(@i AS VARCHAR(10)), @i * 10, '男');
SET @i = @i + 1
END
sp_executesql
EXEC sp_executesql
N'INSERT INTO 顧客 (名前, 年齢, 性別)
VALUES (@name, @age, @gender)',
N'@name VARCHAR(10), @age INT, @gender CHAR(1)',
@name = '田中', @age = 25, @gender = '男'
OPENROWSET
INSERT INTO 顧客 (名前, 年齢, 性別)
SELECT 名前, 年齢, 性別
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:\data\customers.xls', 'Excel 8.0;HDR=Yes')
データインポートツール
SQL Server Management Studio (SSMS) などのデータインポートツールを使用して、データをインポートすることもできます。
- 上記の方法は、パフォーマンスや使いやすさの面でいくつかの違いがあります。
sql sql-server t-sql