スクリプトを実行すると、パフォーマンスの問題が発生します。印刷の問題とそのパフォーマンスについて読んでいましたが、影響を減らす方法がわかりません。
アルゴリズムはO(n ^ 2)です。メインループは約50kの要素を通過します。それらのそれぞれについて、異なるテーブルからデータを取得するためにいくつかの選択を実行し、最後に2つのサブループを実行します
Main loop(n)
-- some selects...
nested loop(n^2)
nested loop(n^2)
デバッグの目的だけでなく、要件のためにも、内部にはさまざまなプリントがあります。また、すべてのスクリプトをトランザクションにラップすると、パフォーマンスが劇的に低下します。
3つのポイント:
-印刷の影響を減らす方法はありますか?
-パフォーマンスの向上点:カーソルまたはカウンター付きループ
-トランザクション内のパフォーマンスが低いのは正常ですか?
コード:
サーバー:Windows Server 2008 R2(2Gb RAM)
DBMS:SQL Server 2008 R2
クライアント:SQL Management Studio2012を実行しているWindows7。
要件は、誤った行で出力を表示することです。これは(本番環境では)最大80行の小さなリストになります。 50kのプリントは作成されません。これが、出力での印刷が比較的まれな場合に、パフォーマンスの問題を解決する方法がわからない理由です。今私のテストケースは500-800行の間を示しています。スクリプトは、3つの環境で1回だけ実行されます。
テーブル変数を宣言し、出力してダンプするのではなく、それに挿入することができますtotoプロセスの最後に:
declare @message table (i int identity(1,1), words varchar(100));
ID列は、物事を時系列に保持します。 @tablesのコンテンツはロールバック後も存続するため、この目的では#tablesや通常のテーブルよりも推奨されます。
私はこの提案をプロファイリングしていません。私はそれが価値があるもののためにそこにそれを捨てます。