私たちの環境では、1 つの手順の実行に時間がかかります。手順を確認しました。以下に概要を示します-
手順には、選択ブロック (約 24) のみが含まれます。各選択の前に、データが存在するかどうかを確認しています。はいの場合はデータを選択し、そうでない場合は別のことを行います。例えば :
-- Select block 1 -- IF EXISTS (SELECT 1 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col2='someValue' AND t2.col2='someValue' ) BEGIN SELECT t1.col1,t2.col2,t2.col3 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col2='someValue' AND t2.col2='someValue' END ELSE BEGIN SELECT 'DEFAULT1', 'DEFAULT2', 'DEFAULT3' END -- Select block 2 -- IF EXISTS (SELECT 1 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col5='someValue' AND t2.col5='someValue' ) BEGIN SELECT t1.col5,t2.col6,t2.col7 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col5='someValue' AND t2.col5='someValue' END ELSE BEGIN SELECT 'DEFAULT1', 'DEFAULT2', 'DEFAULT3' END
どういうわけか、IF EXISTS ブロック内で使用されるクエリを 1 つのクエリに結合し、いくつかの変数に値を設定して、どの条件が true を返すかを識別できるようにすれば、実行時間を短縮できるという結論に達しました。そしてパフォーマンスを向上させます。
私の考えは正しいですか?それを行うオプションはありますか?他のオプションを提案できますか?
Microsoft SQL Server 2005 を使用しています。
[編集: 追加] - すべての select ステートメントは、異なる同じ列タイプを返しません。また、すべての select ステートメントが必要です。24 個の if ブロックがある場合、プロシージャは 24 個の結果セットを返す必要があります。
[追加した]
もう1つお聞きしたいのですが、以下のどれがより速く実行されますか-
- SELECT 1 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col2='someValue' AND t2.col2='someValue'
- SELECT COUNT(1) FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col2='someValue' AND t2.col2='someValue'
- SELECT TOP 1 1 FROM table1 t1 INNER JOIN table2 t2 ON t1.col1=t2.col1 WHERE t1.col2='someValue' AND t2.col2='someValue'
ありがとう。カルティック