Параметризованная производительность запросов Powershell и MySQL

Я столкнулся с проблемой производительности с Powershell и генерацией параметризованных запросов. Я почти уверен, что поступаю неправильно, и надеюсь, что кто-то может помочь.

Вот проблема: вставка 1000 строк (по 15 столбцов в каждой) занимает около 3 минут при использовании параметризованных запросов. Использование не параметризованных пакетных вставок занимает менее секунды. Кажется, проблема заключается в том, как я генерирую параметры, так как это часть кода, которая ест большую часть времени. Цикл убивает производительность. Проблема не была бы большой, если бы у меня было всего 1000 строк, но есть миллионы.

Вот что у меня так далеко. Для краткости я опустил немного. Но, не поймите меня неправильно - это, безусловно, работает. Это просто мучительно медленно.

$values = @() #some big array of values
$sqlCommand.CommandText = "INSERT INTO ``my_db``.``$table`` (dataseries_code,dataseries_text) VALUES (?,?),(?,?)" #abbreviated for for the sake of sanity

for($i = 0; $i -lt $values.Count; $i++) {
    $sqlCommand.Parameters.AddWithValue($i, $values[$i]) #this is the slow part
}

$insertedRows = $sqlCommand.ExecuteNonQuery()
Write-Host "$insertedRows"
$sqlCommand.Parameters.Clear()

Должен быть лучший способ сгенерировать оператор.Parameters.AddWithValue? Я взглянул на метод.AddRange, но не мог понять, как заставить его работать и был ли он вообще предназначен для того, что я пытаюсь сделать.

РЕДАКТИРОВАТЬ: я должен был упомянуть, что я также попытался сначала создать параметры, а затем добавить значения. Создание параметров заняло 3 минуты, а добавление значений - 3 минуты! (см. пример ниже). Всего 6 минут для 30 000 строк! Что-то неправильно.

Я не могу не думать, что должен быть более быстрый метод для параметризованных вставок?!

#THIS PIECE WILL ONLY RUN ONCE
#this is where we create the parameters first
for($i = 0; $i -lt @($values).Count; $i++) {
    $command.Parameters.Add((New-Object MySql.Data.MySqlClient.MySqlParameter($i[MySql.Data.MySqlClient.MySqlParameter]::VarChar))) | out-null
}

#THIS PIECE WILL RUN MULTIPLE TIME
#and this is where we add the values
for($i = 0; $i -lt @($values).Count; $i++) {
    $command.Parameters[$i].Value = $values[$i] | Out-Null
}

Спасибо!

1 ответ

Как насчет создания объекта команды и добавления параметров, а затем циклического перебора значений.

Вместо того, чтобы очищать параметры каждый раз, вы можете просто изменить значение. Это позволит избежать создания / удаления большого количества объектов.

Другие вопросы по тегам