ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

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