読者です 読者をやめる 読者になる 読者になる

数百万件のデータを簡単に作成する方法

負荷テストを行うために数百万件のデータが必要になることがあります。

1行1行追加していくのは大変ですねよ。

そこで、SELECT文とINSERT文を使用してデータを増やしていきます。


IDENTITY(自動連番)の場合

// 1件追加する.
INSERT INTO <テーブル名> (カラム名) VALUES(追加する値);

// 2件にする.
INSERT INTO <テーブル名> (カラム名) SELECT * FROM <テーブル名>;

// 4件にする.
INSERT INTO <テーブル名> (カラム名) SELECT * FORM <テーブル名>;

// 上記のコードを20回繰り返すと100万件のデータが作成できます。

PK(プライマリーキー)が連番でない場合

// PK : RequestId

// 1件追加する.
INSERT INTO <テーブル名> (RequestId) VALUES(0);

// 2件にする.
INSERT INTO <テーブル名> (RequestId) SELECT RequestId = RequestId + 1 FROM <テーブル名>;

// 4件にする.
INSERT INTO <テーブル名> (RequestId) SELECT RequestId = RequestId + 2 FROM <テーブル名>;

// 8件にする.
INSERT INTO <テーブル名> (RequestId) SELECT RequestId = RequestId + 4 FROM <テーブル名>;

// 上記のコードを20回繰り返すと100万件のデータが作成できます。

以上のコードで数百万件のデータが簡単に作成できます。


おまけ

PK(プライマリーキー)が数値と文字列の組み合わせの場合

// -- カラム一覧 --
// - RequestId
// - RequestData
// - InsertDateTime
// - UpdateDateTime


// 1件追加する.
INSERT INTO <テーブル名> (RequestId, RequestData, InsertDateTime, UpdateDateTime) 
VALUES('Provisional00000001', 'リクエストデータ', GETDATE(), GETDATE() );

// 2件にする.
// この際に RequestId と InsertDateTime を変更して追加する.
INSERT INTO <テーブル名> (RequestId, RequestData, InsertDateTime, UpdateDateTime) 
SELECT 
 RequestId = 'Provisional' + RIGHT( '00000000' + CONVERT( varchar, CONVERT( int, SUBSTRING ( RequestId ,12 , 8 ) ) + 1 ), 8)
,RequestData
,InsertDateTime = GETDATE()
,UpdateDateTime
FROM <テーブル名>;


// 4件にする.
INSERT INTO <テーブル名> (RequestId, RequestData, InsertDateTime, UpdateDateTime) 
SELECT 
 RequestId = 'Provisional' + RIGHT( '00000000' + CONVERT( varchar, CONVERT( int, SUBSTRING ( RequestId ,12 , 8 ) ) + 2 ), 8)
,RequestData
,InsertDateTime = GETDATE()
,UpdateDateTime
FROM <テーブル名>;

参考サイト
[SQLServer] 数値を0埋めの文字列で表す | 大都会で働く新人SEの日記
【SQL変換関数】CONVERT – 型の変換を行う(SQL Server) – SQL Master データベースエンジニアとLinuxエンジニアのための情報まとめ
SUBSTRING (Transact-SQL)