0

Carsは、CarType列を持つテーブルです。CarTypeはnullではなく、2つの値を含めることができます。CarDonatedおよびCarSold。

レポートからパラメータを渡して、すべてのCarTypeまたは特定のCarType(CarDonatedなど)を含めます。

シナリオ1のパラメーターは、「Car」(すべてのCarType)、「CarD」(CarDonated)、「CarS」(CarSold)のいずれかを渡します。

select *
from Cars c
where c.CarType like @CarTypeParam + '%'

また

シナリオ2のパラメーターは、「0」(すべてのCarType)、「CarDonated」、「CarSold」を渡します。

select *
from Cars c
where c.CarType = case when @CarTypeParam = '0' 
                   then c.CarType
                   else @CarTypeParam 
                  end

どのシナリオ/コーディング方法が優れていますか?where句でcaseステートメントを使用することにあまり慣れていません。オプティマイザーは、両方のシナリオでCarTypeのインデックスを引き続き使用できますか?どちらがより適切にコーディングされていますか?

SQL Server 2008 R2(およびSSRS)

4

2 に答える 2

2

最初のものは、式が完全に引数をとることができないのに対して、CarType like @CarTypeParam + '%'少なくともインデックスで範囲シークを実行できるので、潜在的にわずかに優れています。CarTypeCASE

CarType選択性が50%しかない場合でも、クエリのすべての列をカバーする先頭の列を持つインデックスがない限り、インデックスが使用される可能性はほとんどありません。

于 2012-09-27T16:31:49.553 に答える
1

Gabe-これを判断する最良の方法は、自分でテストすることです。両方に対して生成されたクエリプランを見て、少なくとも、両方のクエリがスキャンではなくシークを実行していることを確認します。次に、プロファイラーでサーバーを監視しながらこれらのクエリを実行し、それぞれが実行している読み取りの数を確認します。これにより、全体的なリソースがより多く使用されている可能性があります。これは、あなたが書いているどんな質問に対しても適切なアドバイスです。

于 2012-09-27T16:51:20.347 に答える