1

データベースから任意の SQL クエリを取得する PowerShell スクリプトを作成しています。これらのクエリは非常に大きくなる可能性があり、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()

私が間違っていること/修正方法を知っている人はいますか?

4

1 に答える 1

2

Snapinsを追加します。

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"

行を繰り返します:

foreach ( $DBComputer in $DBComputers ) {

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

}

上記の例を使用して、PowerShellで多くのSQLを実行しました。上記の例では、DellR720サーバー上のSQLStandardインスタンスのデータをかなり高速でクエリしています。これはMicrosoftAccessデータベースですか、それとも真のSQLインスタンスですか。Access Engineは理想的ではなく、ディスクの種類によっては多くのことが重要になります。

大規模なデータセットについておっしゃいましたが、最大のことは、データベースのインデックスが作成され、コード以外の観点からデータベースについて詳しく知ることなく、実際のSQLエンジンを実行していることを確認することだと思います。

于 2013-03-19T16:56:03.237 に答える