Powershell SqlCommand和StreamWriter慢写
我正在写一个PowerShell脚本,从数据库中提取任意的SQL查询。这些查询可能会变得非常大,在尝试sqlcmd后,我最终得到了StreamWriter/SqlCommand组合。我遇到的问题是执行速度有点慢。像10倍一样慢。我被告知它应该更快,因此问题。 要代码!Powershell SqlCommand和StreamWriter慢写
$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()
任何人都知道我在做什么错误/如何解决它?通过行
$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"
Iteriate:
添加Snapins:
Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
打电话给你的变量:
$SQLUsername = "user"
$SQLPassword = "password"
$SQLDatabase = "database"
$SQLServer = "localhost"
抓住你的数据
foreach ($DBComputer in $DBComputers) {
Write-Host $DBComputer.Name ##$DBComputer.COLUMNNAME
}
通过使用上面的示例,我已经使用PowerShell完成了大量SQL。上面的例子查询戴尔R720服务器上SQL标准实例的数据,速度相当不错。这是Microsoft Access数据库还是一个真正的SQL实例? Access Engine并不理想,根据您的磁盘类型不同,重要的问题也很重要。
您提到了一个大型数据集,我认为最重要的是确保数据库建立索引并运行真正的SQL引擎,而无需从非代码角度更多地了解数据库。
这是一个真正的SQL实例,由于查询是任意的,所以结构并不重要。数据吞吐量是问题所在。问题相当大,在我最近遇到的情况下,数据大约为100MB。我之前使用过SQLCMD,但误诊了一个内存/大小问题(我写入ZIP文件的缓冲区内存不足100MB),并将其重写为使用StreamWriter。我很好奇为什么我的表现差距如此之大。 – 2013-03-19 17:21:05
你可能会做不必要的循环?不完全确定,但是可以使用该示例,只需执行以下操作即可将所有内容以单行形式呈现为CSV格式,因为这正是您正在做的事情,只需手动完成。 'Invoke-Sqlcmd -Query“SELECT * FROM Physical”| Export-Csv -Path C:\ Export.csv -NoTypeInformation' – tkrn 2013-03-19 17:32:34
Export-Csv是否管理现场报价? Invoke-Sqlcmd提供了选择分隔和导出的选项,但输出没有像需要的那样干净利落。作为一个方面说明,我以前的实现是:sqlcmd -Q $ Myquery -d $ CurrentDB -S $ CurrentServer -o $ sqlOutput -E -k -W -s“\t”-t 500 – 2013-03-19 17:59:17
如果你真的说它变慢时,它会有很多帮助。在剧本中你有很多回应,那么在它真的很慢之前最后一条消息是什么?此外,sqlcmd可能会更快(我还没有测试过),因为使用powershell时需要生成对象等,而sqlcmd只需写下未分析的行。 – 2013-03-19 17:07:33
从性能的角度来看,重要的块是逐行读取,即while循环的部分。 while循环可以每分钟读取/写入大约五兆字节的数据,这看起来很慢。 – 2013-03-19 17:23:45