都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

SQL Server のチューニングについてまとめてみる - その2 - ( フィルタ選択されたインデックス )

 今日、ふと気づいたのですが、『 SQL Server のチューニングについてまとめてみる 』シリーズは『 その1 』で終わってましたね (笑)  その1 で終わるのもどうかと思ったので、その2 をまとめてみたいと思います。( 適当すぎる.... ) 今回は、SQL Server 2008 から機能追加された、フィルタ選択されたインデックスについて説明します。

 フィルタ選択されたインデックスは、例えば、テーブルのあるフィールドの内容が大部分 NULL の場合、そのフィールドの値が NULL ではないレコードだけを含むインデックスを作成することができます。( フィルター条件は Where 句に指定するような感じです。 )

 いつもの、AdventureWorks データベースで実験してみましょう。対象とするテーブルは、Sales.SalesOrderDetail です。

f:id:koogucc11:20140415040851p:plain

 CarrierTrackingNumber 列にインデックスを作成します。

f:id:koogucc11:20140415041111p:plain

 Leaf レベルの行数が、『121317件』で、総件数と一致しています。

f:id:koogucc11:20140415081730p:plain

f:id:koogucc11:20140415082921p:plain

 同様にCarrierTrackingNumber 列にインデックスを作成します。ただし、今回は、フィルターの条件に、『 CarrierTrackingNumber IS NOT NULL 』を設定します。

f:id:koogucc11:20140415042123p:plain

 Leaf レベルの行数が、『60919件』で、NULL のレコードを除いた行数と一致しています。

f:id:koogucc11:20140415081911p:plain

f:id:koogucc11:20140415082903p:plain

 フィルタ選択されたインデックスを使用することで、ある条件に合致した効率的な検索を行うことができます。あと、インデックスに格納される物理的な行数も減少するため、I / O 負荷も減るでしょうし、高速化もされるのでしょう。

※しかし、業務的を加味したインデックス設計は結構難しそうです。結構経験も必要そうですが...