我有一个脚本,每天遍历一个目录中的几千个文件,并希望更新一个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()
我并不关心脚本运行的速度,因为它已经非常快,更多的是关于不影响数据库性能。
亲切的问候, 罗布。
答案 0 :(得分:0)
如评论中所述,您将需要针对实例配置和现有工作负载进行测试,以确定解决方案是否有效。
我对使用PowerShell“应用程序”有类似的经验,该应用程序获取了一个帐户标识符列表,然后将其插入到表中供我们进一步处理。该应用程序正在遍历每个ID,并最初对每个ID进行INSERT。对于大多数用户来说,这是可以的,但偶尔会有人输入10万多个ID,而该应用程序的性能令人震惊! (但是SQL Server仍然保持预期的性能)使用SqlBulkCopy
的速度极大地提高了客户端的处理速度,并且对SQL Server也没有明显的影响。 (尽管只有记录丰富的人才能从中受益。但是与<100条记录相比并没有真正的变化。)
Write-DataTable和Out-DataTable是方便的函数,必须使其变得更容易。
我的感觉不佳,是最佳实践。...
Eugene Philipov在其对单值插入,多值插入和BulkCopy之间的数据加载方法性能所做的测试中拥有good article。他们发现插入的列数对操作速度有很大的影响。列越多,在插入中使用多个值或使用批量复制所获得的好处就越少。但是,每条记录使用一次插入总是比较慢(按执行时间)。
执行速度更快==减少了阻塞/消耗其他工作流程所需资源的机会。