2018年3月17日土曜日

SQL Serverでインデックスを上手く使ってくれない場合について(データのバラツキが少ないキー項目に対する処理について)


Customerテーブル(とても大量のデータ)には、clusterd indexがCustomerID、nonclustered indexがStatusがあります。

その場合に、

select CustomerName, Address, City from Customers where Status = @Status

のクエリが非常に異常に遅くなります。実行プランを見てみるとフルスキャン(全走査)が走っています。

原因は、Status列のindexについて統計情報のバラツキ(標準偏差)が小さいのでオプティマイザが平均してフルスキャンしたほうが早いと判断しているのだと考えられます。

この対策については、案が2つあって

1)対象データ量がある程度多い場合は、nonclustered indexにCustomerName, Address, Cityを追加して上げるといい。(バラツキをもたせると同時に、データノードへのアクセスを抑制する)
2)抽出するデータ量が少ない場合は、nonclustered indexをヒント指定が良い。(データノードへの索引が許容できるという判断の場合の選択)

という選択肢があります。

選択における数式的な分岐点は、


0 件のコメント:

コメントを投稿