2012-05-09 7 views
2

行の特定のサブセットが読み込みに非常に熱いテーブルがあるとします。 peopleテーブルにis_aliveというフラグがある場合と同様です。または、ソフト/論理削除を実装し、検索条件に常にis_deleted = 0が含まれている場合。カーディナリティフラグの値を低くする必要がありますか?

これらのフィールドは、これらのテーブルのインデックスに含める必要がありますか?もしそうなら、それらはもっと左か右にあるべきですか?

people [ last_name ] 
people [ zip_code ] 
people [ gender ] 

widgets [ category_id ] 
widgets [ seller_id ] 

あなたがそれらを

people [ last_name, is_alive ] 
widgets [ category_id, is_valid ] 

それとも

people [ is_alive, last_name ] 
widgets [ is_valid, category_id ] 

のように見えるようでくださいブール自体がない限り、低カーディナリティ/意義を持っている...あなたはのようなインデックスを持っているとしましょうそれらは他の検索基準とペアになっています。

ほぼ毎回使用されていますが、このフィールドはすべてのインデックスに追加されています。たぶんそれ自体が「問題」ですか?行は、同じスキーマを持つ別のテーブルにシャトルされるべきですか?基本的にフラグを分割する。

ベンダーにとらわれない。

+2

'performance'と' Vendor Agnostic'を一緒に使うべきではありません。** EVER ** for SQL。どのように効率的であるかは、そのベンダーの実装に100%依存します。 – JNK

+0

+1 @JNK ...私はあなたにSQL Serverのこの質問に対する回答を与えることができますが、それはSQL Serverに関連する回答に過ぎません... –

+0

@JNKポイントは取られましたが、私は理論/ルール大文字の親指をケースバイケースで適用できます –

答えて

0

一部RBDMSsも、それは通常、そのインデックスの選択だ...しかし、ベンダーに依存しないでなければなりません

何か...あなたは、このようなSQL Server 2000のように、ビットフィールドにインデックスを配置させませんその有用性を判断する。

インデックスがis_aliveで、スプリットが50%生存/ 50%死んでいる場合、そのインデックスは有効であるほど選択的ではありません。

しかし、分割が99%生存、1%死亡のようなものであれば、死者を検索するときにインデックスを使用できますが、生きた人を検索するときは無視されます。

だから、インデックスあなたは、インデックスのメンテナンスのオーバーヘッドを正当化するために、その特定の値を持つ行のために十分な頻度で検索フィールドに特定の値を持つ行の小さな割合があるかどう、便利であってもよく。

ただし、これは使用しているRDBMSに完全に依存しており、その特定のRDBMSに対してパフォーマンスに関する設計上の考慮事項をテストする必要があります。

0

索引が問合せに役立つ重要な方法の1つは、全表スキャンのために読取りが必要なページ数を減らすことです。データベースエンジンはページを管理しており、レコードを格納しています。私たちに顧客のテーブルがあり、それには州のインデックスがあるとします。単一の状態にフィルタリングするクエリは、データのほんの一部を読み取る必要があります。もちろん、その割合は、小規模な州では10%(カリフォルニア州)対1%未満のようになります。問題は、このデータを読み取るために必要なページ数です。

この質問に答えるには、情報が必要です。(1)どのように選択クエリですか? (2)ページに収まるレコードの数はいくつですか?したがって、100レコードがページに収まる場合、行の2%を選択するクエリはほとんどの場合、常にすべてのページを読み込む必要があります。この場合、索引は全表スキャンを支援していません。インデックスはオーバーヘッドを発生させるため、おそらく使用しないでください。

一方、1つのレコードしかページに収まらない場合、2%の行を選択するクエリはページの2%を読み込むだけで、50倍の節約になります。ほとんどの場合、インデックスによって被るオーバーヘッドはそれに値する。

インデックスは複数の目的で使用されるため、異なるデータベースエンジンによって異なるインデックスが実装されるため、ページテーブルが異なる方法で実装されるなどの理由で厳格ではありません。しかし、私は一般的に、カーディナリティの低いフラグはおそらくインデックスの良い候補ではないと言うことができます。

私はそれについて考えると、インデックスが効率的であるかもしれない1つのケースを考えることができます。これは、幅広い行と、索引によって排他的に処理できる照会(selectフラグ、フラグによって表グループからのカウント(*))です。

一方、このようなフラグが複数ある場合、コンポジットインデックスはパフォーマンスのクエリに役立ちます。

関連する問題