【问题标题】:Powershell SQL Server Insert - Best PracticePowershell SQL Server 插入 - 最佳实践
【发布时间】:2018-01-30 12:03:08
【问题描述】:

我有一个脚本,它每天遍历一个目录中的几千个文件,并且想用每个文件的详细信息更新 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()

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

【问题讨论】:

  • 如果脚本运行得很快,这可能不是问题,但大致了解您希望插入的行数会有所帮助。如果数字很大,处理一个大事务可以减少日志大小。
  • 我很确定不会有明显差异,因为 SQL-Server/ADO.NET 使用 connection pooling。但要知道它,你必须测试它。 ;-)
  • 感谢 cmets 小伙子。它为每个处理的文件插入一行,因此每天大约 2k。我想我会保持原样。干杯,罗伯。

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


【解决方案1】:

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

我在使用 PowerShell“应用程序”时也有类似的经历,该应用程序获取帐户标识符列表,然后将它们插入到表中以供我们进一步处理。该应用程序正在遍历每个 ID 并最初为每个 ID 执行 INSERT。这对大多数用户来说是可以的,但偶尔有人会放入 100k+ id,并且应用程序的性能非常糟糕! (但 SQL 服务器继续按预期运行)使用SqlBulkCopy 速度极大地提高了客户端的处理速度,而对 SQL 服务器也没有明显的影响。 (不过,只有拥有大量记录的人才能受益。但

Write-DataTableOut-DataTable 是方便的函数,必须让这更容易。

我的感觉不碍事,最佳实践....

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多