SQL Serverに億単位のテストデータを作成する
SQL Server 2014を導入しているシステムで21億件(int型の最大値まで)のテストデータで検証する必要があったのでテストデータの作成方法を調べた。
最初にストアドでWHILEを使ってINSERTしていたら10日間ほどかかる計算になった。
ネットを調べると高速にテストデータを作成する方法が見つかったので試してみた。
SqlBulkCopyというメソッドを使用する。
で、下記のプログラムを作成した。
実行した結果、7700万件で27分でした。
*あとで21億件のかかった時間を追記予定
実行してたら11億件あたりで外付けHDDが壊れた。
別の外付けHDDを用意して実行したら、HDDからの応答がなくなった。
HDDは生きてるっぽい。
Imports System.Data.SqlClient Private Sub CreateTestData() Dim connectionString As String = "Data Source=WINSERVER\MSSQLSERVER;Initial Catalog=TEST_DB;User ID=test_user;Password=test_user" Dim rowCount As Integer Dim stopCount As Integer Dim sbc As SqlBulkCopy = New SqlBulkCopy(connectionString, SqlBulkCopyOptions.TableLock) sbc.DestinationTableName = "TEST_TABLE" rowCount = 0 stopCount = 2147483647 Dim sw As Stopwatch = Stopwatch.StartNew() Dim i As Integer For i = 0 To 220000 sbc.WriteToServer(TestDataTable(rowCount, stopCount)) If stopCount = rowCount Then Exit For End If Debug.Print(sw.Elapsed.ToString()) Next sw.Stop() End Sub Private Function TestDataTable(ByRef rowCount As Integer, ByVal stopCount As Integer) As DataTable Dim dt As New DataTable With dt .Columns.Add("ID", Type.GetType("System.Int32")) .Columns.Add("CHECK_FLG", Type.GetType("System.Int32")) .Columns.Add("EMG_DATE", Type.GetType("System.DateTime")) .Columns.Add("RES_DATE", Type.GetType("System.DateTime")) .Columns.Add("ITEM_NAME", Type.GetType("System.String")) .Columns.Add("SUB_NAME", Type.GetType("System.String")) .Columns.Add("TAG_NAME", Type.GetType("System.String")) .Columns.Add("UNIT", Type.GetType("System.String")) .Columns.Add("ITEM_TYPE1", Type.GetType("System.String")) .Columns.Add("ITEM_TYPE2", Type.GetType("System.String")) .Columns.Add("ITEM_TYPE3", Type.GetType("System.String")) .Columns.Add("VALUE", Type.GetType("System.Double")) .Columns.Add("COMMENT", Type.GetType("System.String")) End With Dim row As DataRow Dim i As Integer For i = 1 To 10000 row = dt.NewRow row("ID") = rowCount row("CHECK_FLG") = 0 row("EMG_DATE") = DateTime.Now row("RES_DATE") = DateTime.Now row("ITEM_NAME") = "" row("SUB_NAME") = "" row("TAG_NAME") = "" row("UNIT") = "" row("ITEM_TYPE1") = "" row("ITEM_TYPE2") = "" row("ITEM_TYPE3") = "" row("VALUE") = 0.0 row("COMMENT") = "" dt.Rows.Add(row) If stopCount = rowCount Then Exit For End If rowCount += 1 Next Return dt End Function