Powershell和MySQL参数化查询性能

Powershell和MySQL参数化查询性能,mysql,powershell,parameterized-query,Mysql,Powershell,Parameterized Query,我在Powershell和生成参数化查询时遇到了性能问题。我很确定我做得不对,希望有人能帮上忙 问题是:在使用参数化查询时,插入1000行(每行大约15列)大约需要3分钟。使用非参数化批插入只需不到一秒钟的时间。问题似乎在于我如何生成参数,因为这是占用大部分时间的代码部分。循环正在破坏性能。如果我只需要处理1000行的话,这个问题就没什么大不了的了——但是,有数百万行 这是我到目前为止所拥有的。为了简洁起见,我省略了不少。但是,别误会我的意思——它确实有效。它只是慢得令人痛苦 $values =

我在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分钟!(见下面的例子)。30000排总共6分钟!有点不对

我忍不住认为必须有一种更快的方法来进行参数化插入

#此部件只运行一次
#这是我们首先创建参数的地方
对于($i=0;$i-lt@($values).Count;$i++){
$command.Parameters.Add((新对象MySql.Data.MySqlClient.MySqlParameter($i[MySql.Data.MySqlClient.MySqlParameter]::VarChar)))|输出null
}
#这件作品将运行多次
#这就是我们添加值的地方
对于($i=0;$i-lt@($values).Count;$i++){
$command.Parameters[$i].Value=$values[$i]| Out Null
}

谢谢

如何构建命令对象并添加参数,然后在值之间循环


不必每次都清除参数,只需更改值即可。这将避免大量的对象创建/处理。

IMO您不应该使用此类查询,它们只会降低您的性能。相反,您可能希望使用批处理查询或多个简单的
insert
语句。我不同意。参数化查询允许您避免SQL注入。而且,正如我所提到的,常规的批插入执行得很好。您应该尝试1000个单数
insert
语句,而不是一个包含2000个参数的大语句。如此大的参数列表可能会减慢查询速度,并阻止服务器缓存查询。嗨,迈克。好的一点-我忘了我已经试过了,遇到了同样的问题。每次创建参数并向其添加值都需要3分钟。我很困惑为什么如此基本的东西会表现得如此糟糕。大容量插入和准备好的语句并不完全是新功能。@Jeremy,您的代码没有使用真正的语句。我假设SQL团队没有优化您在参数化查询中包含许多参数的案例。问题是关于MySQL,而不是MSSQL。@ForNeVeR…设置15个值需要3分钟?你说的是1000行15列,对吗?你能编辑这篇文章来显示创建一次参数并设置每行的值吗?@Mike-所以,也许这就是我出错的地方。。。我已经做了1000行插入(每行15列)。在脚本的另一部分中,我创建了价值占位符:(?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)x 1000。这部分是次秒。然后我进入添加参数的部分(请参见问题中的代码),这部分需要花费很长时间。