繁体   English   中英

Powershell SQL Server插入 - 最佳实践

[英]Powershell SQL Server Insert - Best Practice

我有一个脚本,每天遍历一个目录中的几千个文件,并希望更新一个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()

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

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

我有一个类似于PowerShell“app”的经验,它获取了一个帐户标识符列表,然后将它们插入到表中供我们进一步处理。 该应用程序正在迭代每个ID并最初为每个ID执行INSERT。 这对大多数用户来说都没问题,但偶尔有人会放入100k + ID并且应用程序的性能很可怕! (但SQL服务器保持按预期执行)使用SqlBulkCopy速度,对客户端进行极大的处理,对SQL服务器也没有明显的影响。 (只有拥有大量记录的人才能获得好处。尽管如此,<100条记录没有真正的变化。)

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

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

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

更快的执行==您将阻止/消耗其他工作流所需资源的机会减少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM