web-dev-qa-db-ja.com

Transact-sqlでの印刷、トランザクション、カーソルのパフォーマンス

スクリプトを実行すると、パフォーマンスの問題が発生します。印刷の問題とそのパフォーマンスについて読んでいましたが、影響を減らす方法がわかりません。

アルゴリズムはO(n ^ 2)です。メインループは約50kの要素を通過します。それらのそれぞれについて、異なるテーブルからデータを取得するためにいくつかの選択を実行し、最後に2つのサブループを実行します

Main loop(n)
-- some selects...
   nested loop(n^2)
   nested loop(n^2)

デバッグの目的だけでなく、要件のためにも、内部にはさまざまなプリントがあります。また、すべてのスクリプトをトランザクションにラップすると、パフォーマンスが劇的に低下します。

3つのポイント:

-印刷の影響を減らす方法はありますか?

-パフォーマンスの向上点:カーソルまたはカウンター付きループ

-トランザクション内のパフォーマンスが低いのは正常ですか?

コード:

http://Pastebin.com/X5SiKcgq

サーバー:Windows Server 2008 R2(2Gb RAM)
DBMS:SQL Server 2008 R2
クライアント:SQL Management Studio2012を実行しているWindows7。

要件は、誤った行で出力を表示することです。これは(本番環境では)最大80行の小さなリストになります。 50kのプリントは作成されません。これが、出力での印刷が比較的まれな場合に、パフォーマンスの問題を解決する方法がわからない理由です。今私のテストケースは500-800行の間を示しています。スクリプトは、3つの環境で1回だけ実行されます。

1
blfuentes

テーブル変数を宣言し、出力してダンプするのではなく、それに挿入することができますtotoプロセスの最後に:

declare @message table (i int identity(1,1), words varchar(100));

ID列は、物事を時系列に保持します。 @tablesのコンテンツはロールバック後も存続するため、この目的では#tablesや通常のテーブルよりも推奨されます。

私はこの提案をプロファイリングしていません。私はそれが価値があるもののためにそこにそれを捨てます。

2
Michael Green