2016-06-20 7 views
2

私は、procで動作するtempテーブルに異なるdbsのいくつかの異なるテーブルから選択するストアドプロシージャを作成しました。テーブルを埋めることですべてがうまくいくようです。私が参加しようとすると、私の問題が発生します。これは私が書いたクエリです:SQLクエリの実行が停止しない

SELECT #temp1.id, 
    #temp2.first_name, 
    #temp2.last_name, 
    #temp3.DOB, 
    #temp4.Sex, 
    #temp5.SSN 
FROM (((#temp1 
LEFT JOIN #temp3 ON #temp1.id = #temp3.id) 
LEFT JOIN #temp4 ON #temp1.id = #temp4.id) 
LEFT JOIN #temp2 ON #temp1.id = #temp2.id) 
LEFT JOIN #temp5 ON #temp1.id = #temp5.id; 

クエリはある程度機能します。出力ウィンドウには選択結果が入力されます。問題は、クエリが終了しないことです。新しいレコードを出力に追加することを停止しますが、実行を続行するため、次のステートメントに移動できないため、プロシージャがハングします。何か案は?

+1

一度に1つの結合を実行して、特定の結合がハングアップしているかどうかを確認してください。 「ハングアップ」したときに返される必要があるすべてのレコードが返されることを確認できますか?各テーブルのレコード数IDはすべてのテーブルで一意ですか?重複がある場合、返されるレコードの数は非常に大きくなる可能性があります。これらの質問に答えて、ここであなたを手伝うのがより簡単になるかもしれません。列名と型も同様に役立ちます。 –

+0

クエリが終了しないとはどういう意味ですか?照会が完了していない場合は、照会に問題がある可能性があります。 –

+1

実際の実行計画を見ましたか?もう一つは、ストアドプロシージャを再コンパイルすることです。データベースがデータまたは構造に重大な変更を加えた場合、プロシージャを再コンパイルすると、プロシージャのクエリプランが更新され、それらの変更が最適化されます。これにより、プロシージャの処理性能を向上させることができます。 –

答えて

0

#temp1にはいくつのレコードがありますか?出力ウィンドウに同じ数のレコードが表示されていますか?そうでなければ、あなたのクエリはまだレコードを返しています。

また、スクリプトのどこかで明示的にトランザクションを開始しましたか?たぶんあなたがコミットするかロールバックするのを待っています。

また、なぜあなたの結合の周りにかっこがあるのか​​わかりません。彼らは必要ではありません(そして、あなたはそれらを使って奇妙な実行計画を得ているかもしれません)。

2

私はあなたのクエリが実行計画の5つのすべてのテーブルの高いテーブルスキャンの結果であることがわかります。次のようにあなたは、すべての5つの一時テーブルに結合列(ID)にインデックスを作成することができます

CREATE CLUSTERED INDEX IDX_C_t1_ID ON #temp1(ID) 
CREATE CLUSTERED INDEX IDX_C_t2_ID ON #temp2(ID) 
CREATE CLUSTERED INDEX IDX_C_t3_ID ON #temp3(ID) 
CREATE CLUSTERED INDEX IDX_C_t4_ID ON #temp4(ID) 
CREATE CLUSTERED INDEX IDX_C_t5_ID ON #temp5(ID) 

あなたはすべての5つのテーブルの行と列の数を含めることができればそれは本当に便利になるだろう。

0

このクエリの実行時間が行#のTEMP1内とインデックスにそれは(デフォルトで - >何も)持っていることに(他の中で)によって決まります。
は、実行計画を分離、特にこのクエリのために:私はそれを見るよう

まずステップは次のようになります。あなたはその後、temp1(およびない#temp1)にデータを充填することにより、その

を行うことができます - temp1に対してのみクエリを実行してみてください。

クエリの実行計画を見て、どのインデックスが役立つかをお勧めし、最適化の第一歩になります。

関連する問題