Performance Powershell SqlCommand和StreamWriter慢速写入

Performance Powershell SqlCommand和StreamWriter慢速写入,performance,powershell,file-io,streamwriter,sqlcommand,Performance,Powershell,File Io,Streamwriter,Sqlcommand,我正在编写一个PowerShell脚本,用于从数据库中提取任意SQL查询。这些查询可能会变得非常大,在尝试sqlcmd之后,我最终得到了StreamWriter/SqlCommand组合。我遇到的问题是执行有点慢。像10倍一样慢。有人告诉我应该快一点,这就是问题所在。 去编码 $conn.ChangeDatabase("MyDB") $mycmd = new-object System.Data.SqlClient.SqlComma

我正在编写一个PowerShell脚本,用于从数据库中提取任意SQL查询。这些查询可能会变得非常大,在尝试sqlcmd之后,我最终得到了StreamWriter/SqlCommand组合。我遇到的问题是执行有点慢。像10倍一样慢。有人告诉我应该快一点,这就是问题所在。 去编码

                $conn.ChangeDatabase("MyDB")
                $mycmd = new-object System.Data.SqlClient.SqlCommand($Myquery, $conn) 
                $mycmd.CommandType = [System.Data.CommandType]::Text
                $mycmd.CommandTimeout = 300
                echo "Executing Reader."        
                $Results = $mycmd.ExecuteReader()


                echo "Opening file for writing."                    
                $sw2 = new-object system.IO.StreamWriter($sqlOutput, 1)
                echo "File Opened for Writing."     
                $delimiter = ","
                echo "Starting Row Reading"
                $Counter = $Results.FieldCount
                echo $Counter
                # Put in header row on first execution.
                $currtext = ""
                if ($Counter -gt 0)
                {
                    echo "Writing Header Row as:"
                    for ($i = 0; $i -lt $Counter; $i++)
                    {
                        $currtext = $currtext + $Results.GetName($i)
                        if ($i -lt $Counter - 1)
                        {$currtext = $currtext + $delimiter}
                    }

                    echo $currtext
                    $sw2.writeline($currtext)
                    $firstexecution = 0
                }
                else
                {
                    $sw2.writeline("No Data Found")
                }

                $rowcount = 0
                while ($Results.Read())
                {
                    $rowcount = $rowcount + 1
                    #echo "Reading Row"
                    $i = 0
                    $currtext = ""
                    for ($i = 0; $i -lt $Counter; $i++)
                    {
                        #echo "Processing Row"
                        $currtext = $currtext + """" + [string]$Results[$i] + """" 
                        if ($i -lt $Counter - 1)
                            { $currtext = $currtext + $delimiter }
                    }
                    #echo "Writing Line."
                    #echo $currtext
                    $sw2.writeline($currtext)
                }
                echo "Total Rowcount:" + $rowcount
                $sw2.flush()
                $sw2.close()
                $sw2.dispose()
                $Results.close()
有人知道我做错了什么/如何修复吗?

添加管理单元:

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
调用您的变量:

$SQLUsername        = "user"
$SQLPassword        = "password"
$SQLDatabase        = "database"
$SQLServer          = "localhost"
抓取您的数据:

$DBComputers = Invoke-Sqlcmd -ServerInstance $SQLServer -Username $SQLUsername -Password $SQLPassword `
 -Database $SQLDatabase -Query "SELECT * FROM Physical WHERE Retired=0 AND OS LIKE '%Windows%' ORDER BY Name"
i在各行中选择:

foreach ( $DBComputer in $DBComputers ) {

    Write-Host $DBComputer.Name    ##$DBComputer.COLUMNNAME

}
通过使用上面的示例,我已经使用PowerShell完成了很多SQL操作。上面的示例以相当快的速度查询Dell R720服务器上的SQL标准实例上的数据。这是Microsoft Access数据库还是真正的SQL实例?访问引擎并不理想,而且根据您的磁盘类型会有很多问题


您提到了一个大型数据集,我认为最重要的是确保数据库被索引并运行一个真正的SQL引擎,而不必从非代码的角度了解更多关于数据库的信息。

如果您真的说数据库变慢了,那会有很大帮助。在你的剧本中有很多回音,那么在它变慢之前的最后一条消息是什么呢?另外,sqlcmd可能会更快(我没有测试过),因为使用powershell时,您需要生成对象等。而sqlcmd只需写下未解析的行。从性能角度来看,重要的块是逐行读取的部分,这意味着while循环。while循环目前每分钟可以读/写大约5兆的数据,这似乎很慢。这是一个真正的SQL实例,由于查询是任意的,所以结构并不重要。问题在于数据吞吐量。问题比较大,;在我最近遇到的实例中,数据大约为100MB。我以前使用过SQLCMD,但误诊了内存/大小问题(我写入ZIP文件的缓冲区内存不足100MB),并将其重写为使用StreamWriter。我很好奇为什么我的性能差异如此之大。你可能在做不必要的循环?不完全确定,但在提供的示例中,您可以简单地执行以下操作,将其转换为CSV格式,因为这是您正在做的,只需手动
Invoke Sqlcmd-Query“SELECT*FROM Physical”| Export Csv-Path C:\Export.Csv-NoTypeInformation
Export Csv是否能很好地管理字段报价?Invoke-Sqlcmd具有拾取定界和导出的选项,但输出结果并没有达到有用的程度。作为旁注,我以前的实现是:sqlcmd-Q$Myquery-d$CurrentDB-S$CurrentServer-o$sqlOutput-E-k-W-S”“-t 500Export Csv有参数定义一个带有
-delimiter“,”
的分隔符。这当然是实验性的,但我不明白如果需要的话,为什么它不带引号。有一个参数用于引用
-我启用引用的标识符
参见引用的标识符不一定意味着数据将被引用。我试着用-s“,”替换-s”(这里的tabchar),它给了我想要的输出。