現在、配列に16k行のデータがあり、forループを使用してデータをループし、INSERTステートメントを実行しています。つまり、各ループはmysqlで「INSERT」ステートメントを実行します。これは16000回行われます。これには長い時間がかかります。
バルクデータを挿入するためのより良い方法はありますか?
現在、配列に16k行のデータがあり、forループを使用してデータをループし、INSERTステートメントを実行しています。つまり、各ループはmysqlで「INSERT」ステートメントを実行します。これは16000回行われます。これには長い時間がかかります。
バルクデータを挿入するためのより良い方法はありますか?
Pascal MARTINの投稿に従って、これを試すことができます。
insert into your_table (field1, field2, field3)
values
(value1_1, value1_2, value1_3),
(value2_1, value2_2, value2_3),
(value3_1, value3_2, value3_3)
私はこのコード(sqlParametersを使用)を使用してSQLでこれを達成しました:
Dim Command As New SqlCommand(_
"insert into hilmarc_cem_items " & _
"(CEMID, " & _
"ItemCode, " & _
"UnitPrice, " & _
"Quantity, " & _
"UOM) "
Dim ItemCodes() As String = Request.Form.GetValues("ItemCode")
Dim UnitPrices() As String = Request.Form.GetValues("UnitPrice")
Dim Quantities() As String = Request.Form.GetValues("Quantity")
Dim UOMs() As String = Request.Form.GetValues("UOM")
For Counter = 0 To ItemCodes.Length - 1
Command.CommandText &= "select @CEMID, @ItemCode" & Counter & ", @UnitPrice" & Counter & ", @Quantity" & Counter & ", @UOM" & Counter & " "
Command.Parameters.Add("@ItemCode" & Counter, Data.SqlDbType.NVarChar).Value = ItemCodes(Counter)
Command.Parameters.Add("@Quantity" & Counter, Data.SqlDbType.Decimal).Value = Quantities(Counter)
Command.Parameters.Add("@UOM" & Counter, Data.SqlDbType.NVarChar).Value = UOMs(Counter)
Command.Parameters.Add("@UnitPrice" & Counter, Data.SqlDbType.Decimal).Value = UnitPrices(Counter)
If Not Counter = ItemCodes.Length - 1 Then
Command.CommandText &= "union all "
Else
Command.CommandText &= ";"
End If
Next
アイデアは、単一のクエリを持ち、配列からすべてのデータを取得し、それらをパラメータとしてsqlCommandに追加することです。クエリは次のようになります。
insert into myTable
(CEMID,
ItemCode,
UnitPrice,
Quantity,
UOM)
select @CEMID, @ItemCode0, @UnitPrice0, @Quantity0, @UOM0
union all
select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1
union all
select @CEMID, @ItemCode1, @UnitPrice1, @Quantity1, @UOM1
union all
これがMySQLで有効かどうかはわかりませんが、コードをMySQLに変換するだけです。
バルクINSERTステートメントを生成してみてください。ステートメントの長さは、max_allowed_packet
1つのパケットまたは生成された/中間の文字列の最大サイズよりも短くする必要があります。
可能であれば、テーブルのインデックスを一時的に無効にするか削除します。