Powershell SQL Server插入 - 最佳实践

时间:2017-08-22 09:19:29

标签: sql sql-server powershell foreach invoke-sqlcmd

我有一个脚本,每天遍历一个目录中的几千个文件,并希望更新一个SQL Server表,其中包含每个文件的详细信息,因为它们是在foreach循环中处理的。

我已经在foreach循环中使用了以下内容:

Invoke-Sqlcmd -Query "INSERT INTO $dbTable (name, date, worknum, identifier) VALUES ('$name','$date','$worknum','$identifier')" 
              -ServerInstance $dbHost -Database $dbName -ErrorAction Stop

虽然这样可以正常工作,但我想知道在文件处理开始之前将此方法更改为建立SQL Server连接是否有任何好处,并在脚本结束时关闭它?像这样......

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$dbHost;Database=$dbName;Integrated Security=True;"

<foreach loop>

$SqlConnection.Close()

我并不关心脚本运行的速度,因为它已经非常快,更多的是关于不影响数据库性能。

亲切的问候, 罗布。

1 个答案:

答案 0 :(得分:0)

如评论中所述,您将需要针对实例配置和现有工作负载进行测试,以确定解决方案是否有效。

我对使用PowerShell“应用程序”有类似的经验,该应用程序获取了一个帐户标识符列表,然后将其插入到表中供我们进一步处理。该应用程序正在遍历每个ID,并最初对每个ID进行INSERT。对于大多数用户来说,这是可以的,但偶尔会有人输入10万多个ID,而该应用程序的性能令人震惊! (但是SQL Server仍然保持预期的性能)使用SqlBulkCopy的速度极大地提高了客户端的处理速度,并且对SQL Server也没有明显的影响。 (尽管只有记录丰富的人才能从中受益。但是与<100条记录相比并没有真正的变化。)

Write-DataTableOut-DataTable是方便的函数,必须使其变得更容易。

我的感觉不佳,是最佳实践。...

Eugene Philipov在其对单值插入,多值插入和BulkCopy之间的数据加载方法性能所做的测试中拥有good article。他们发现插入的列数对操作速度有很大的影响。列越多,在插入中使用多个值或使用批量复制所获得的好处就越少。但是,每条记录使用一次插入总是比较慢(按执行时间)。

执行速度更快==减少了阻塞/消耗其他工作流程所需资源的机会。