【发布时间】:2018-10-07 22:44:37
【问题描述】:
我有这段代码,它是根据时间范围返回 SQL 行列表的函数的一部分。
查询本身(第一行代码)非常快。但是提取相关数据的foreach 循环需要一段时间才能完成。
我有大约 350.000 行要迭代,尽管这需要一段时间,但我想知道是否可以进行任何更改以使其更快。
$SqlDocmasterTableResuls = $this.SqlConnection.GetSqlData("SELECT DOCNUM, DOCLOC FROM MHGROUP.DOCMASTER WHERE ENTRYWHEN between '" + $this.FromDate + "' and '" + $this.ToDate + "'")
[System.Collections.ArrayList]$ListOfDocuments = [System.Collections.ArrayList]::New()
if ($SqlDocmasterTableResuls.Rows.Count)
{
foreach ($Row in $SqlDocmasterTableResuls.Rows)
{
$DocProperties = @{
"DOCNUM" = $Row.DOCNUM
"SOURCE" = $Row.DOCLOC
"DESTINATION" = $Row.DOCLOC -replace ([regex]::Escape($this.iManSourceFileServerName + ":" + $this.iManSourceFileServerPath.ROOTPATH)),
([regex]::Escape($this.iManDestinationFileServerName + ":" + $this.iManDestinationFileServerPath.ROOTPATH))
}
$DocObj = New-Object -TypeName PSObject -Property $DocProperties
$ListOfDocuments.Add($DocObj)
}
return $ListOfDocuments
【问题讨论】:
-
SQL 查询很有可能实际上只在 if/foreach 语句调用期间执行。您是否检查过 SQL 跟踪以了解实际 SQL 查询花费了多长时间?
-
@Russell 查询最多需要 10 秒...我已经调试了代码,在 foreach 中大约需要 5 分钟。坦克
-
酷 - 要检查的另一件事是尝试使用正则表达式匹配删除 2 行以消除它们导致延迟。
-
@Russell 我已经考虑过了,但我需要这个改变。我仍然会尝试将其删除以查看结果。Tnks
-
“以后再改”往往变成“永不改”。
标签: performance powershell foreach iteration