特定のクエリを高速化するために、Oracle10gのインデックスを調査しています。カーディナリティの低い列(従業員テーブルの性別列など、一意の値が非常に少ない列)のインデックス作成が、検索の高速化に役立つことはめったにないことを何度も読んでいます。これは、カーディナリティの低い列のデータが均一に分散されている場合に意味があります。たとえば、従業員レコードの約50%が性別='M'で、残りの約50%が性別='F'です。しかし、データが均一に分散されておらず、大多数と同じキーを持たないレコードを検索している場合はどうでしょうか。上記の性別の列にインデックスを付けた場合、従業員テーブルは男性2%と女性98%の会社のものであり、私たちはすべて男性従業員に対してのみクエリを実行します。この低いカーディナリティの経験則はまだ維持されていますか?
私が今扱っている状況は、null以外のバイナリ列を持つテーブルであり、各レコードには常に1または0が格納されています。このテーブル内には、0の99,999レコードと、1が格納された単一のレコードのようなものがあります。このバイナリ列にb-treeインデックスがある場合、Oracleは全表スキャンを選択します。
私が理解していないことの一部は、キーの大部分が重複している場合にbツリーがどのように見えるか、および重複していない少数派にあるレコードのセットをすばやく見つけることができない理由であると思います。