2

1- Where条件がパフォーマンスに影響を与える場合、ケースを実行します。単一クエリのクエリプランに影響を与え、単一クエリに使用されるインデックスの選択に影響を与えます。

2-case whenステートメントを持つ1つの単一クエリを記述するよりも、Casewhen値の1つのオプションをそれぞれ処理する2つ以上のクエリを記述する方が適切です。

例:

 Select  Acc ,
 Case 
 when  Calculation_type  = 'M' then Min_value 
 when  Calculation_type  = 'E' then Ending_value
 Else 
 Average_BLC
 END
From Table 

Select Acc ,    Min_value 
From Table 
where   Calculation_type  = 'M'
union all 
Select  Acc , Ending_value        
From Table 
where  Calculation_type  = 'E'
union all 
Select   Acc , Average_BLC       
From Table 
where Calculation_type  = 'A'
4

1 に答える 1

1

この場合、最初のオプションは、テーブル (および/またはテーブルのインデックス) を 3 回ヒットするのではなく、1 回ヒットするだけで済むため、ほぼ確実に効率的になります (最初のクエリを意図していると仮定しています)。WHERE calculation_type IN ('A', 'E', 'M')結果が 2 番目のクエリと一致 するようにします)。

一緒にしているクエリごとに 1 つずつ、3 つの異なるカバリング インデックスがありUNION ALL、オプティマイザがそれらのインデックスを使用することが理にかなっている場合、ほとんど違いはないかもしれません。

ただし、これらの列の一部についてテーブルをヒットする必要があると仮定すると、3 つの異なるサブクエリに対してブロックを 3 回読み取るのではなく、テーブル行を 1 回読み取ってすべての列値を取得できるようにする必要があります。

于 2012-10-15T07:25:56.727 に答える