sql - Powershell SQL Server 插入 - 最佳实践

标签 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()

我不关心脚本运行的速度,因为它已经相当快了,我更关心的是不影响数据库性能。

最佳答案

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

我对 PowerShell“应用程序”有类似的体验,该应用程序采用帐户标识符列表,然后将它们插入到表中以供我们进一步处理。该应用程序遍历每个 ID 并最初为每个 ID 执行 INSERT。这对大多数用户来说没问题,但偶尔有人会输入超过 10 万个 ID,应用程序的性能非常糟糕! (但 SQL 服务器保持按预期执行)使用 SqlBulkCopy 可以极大地加快客户端的处理速度,同时对 SQL 服务器也没有明显影响。 (虽然只有拥有大量记录的人才能获益。不过 <100 条记录并没有真正的改变。)

Write-DataTableOut-DataTable有方便的功能,必须使这更容易。

我的感觉,最佳实践....

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

执行速度更快 == 阻塞/消耗其他工作流程所需资源的可能性更小。

关于sql - Powershell SQL Server 插入 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45813604/

相关文章:

powershell - "RenewDHCPLease()"和 "IPConfig/renew"之间的区别?

powershell - Powershell-在运行之前检查脚本的更新

mysql - 在 1 个查询中获取测验数据、问题和答案?

sql - 查找一组日期范围中的空白的好方法是什么?

mysql - 案例陈述失败

c# - 使用C#在SQL表中创建 "monthly timetable/schedule calender"

sql - SQL 选择查询中的排序结果

JAVA、SQL、插入不重复

php - SQL查找表中的特定字符

powershell - 为什么我通过 Chef 获得以管理员身份运行 Octopus Tentacle 的 UnauthorizedAccessException?