フィルタリングされたインデックスは、入力された時間に基づいたクエリを改善するのに役立ちますか、これを避けるべきですか?
-
16-10-2019 - |
質問
MS SQL 2008の新しいフィルタリングされたインデックスについて学んでいるだけで、それらがどこで傷つくのか、どこに役立つかを理解しようとしています。
従業員のテーブルにフィルタリングされたインデックスを追加して、現在の従業員のみをインデックスすることが良い考えだとわかります。
しかし、時間に基づいて、いくつかのフィルタリングされたインデックスを大きなテーブルに適用するのはどうですか。たとえば、Enteredon Date/Timeフィールドを備えたテーブルがあり、テーブルには長年のデータがあるとします。通常、日付に基づいてクエリが実行され、EnteredByなどの他のフィールドがいくつかのフィルタリングされたインデックスがある場合は、TimeSpanにインデックスを制限する句がある場合は良いでしょうか?私の例では、クエリはそのようなものになります
select enteredOn, Description, ...
from myTable
where enteredOn > '2011/01/01' and enteredBy = "My, User"
各年にフィルタリングされたインデックスを持つことは合理的ですか、それとも以下が代わりに質問されたときに多くの問題を引き起こすでしょうか?
select enteredOn, Description, ...
from myTable
where enteredOn > '2009/06/01' and eneteredOn < '2010/06/01' and enteredBy = "My, User"
解決
ビットオフ、
それはいくつかの要因に依存し、すべてのシナリオに対して誰も答えはありません。たとえば、頻繁にアクセスされるため、いくつかの古いデータを専用のディスクセットに分割してアーカイブすることをお勧めします。フィルター処理されたインデックスのためにそのようなパーティションを交換することを検討するとは思いません。そして、フィルタリングされたインデックスを使用するのではなく、特定の列にnullのすべての値のパーティションを作成したいと思います。
キンバリートリップによるパーティションホワイトペーパーを読むべきです http://msdn.microsoft.com/en-us/library/ms345146%28v=sql.90%29.aspx, 、およびフィルタリングされたインデックス設計ガイドラインで見つかった http://technet.microsoft.com/en-us/library/cc280372.aspx.
これらの2つのリンクは、あなたが考慮に入れる必要があるすべての設計上の考慮事項に関して、あなたを正しい方向に向けるのに役立つはずです。