- ベストアンサー
検索スピード
いつもお世話になっています。 データ型ごとの検索速度の違いについて質問なのですが、 データが数字の「1~6」が入るレコードを単独で検索する際に検索速度を最も早くするには・・・ ・CHAR型(1) ・VARCHAR型(1) ・NUMBER型(1) のどれが一番いいのでしょうか? もちろんインデックスがあるのが前提です。 さすがにこれ以外が一番になることは考えにくいのですが、もしあれば教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>データが平均的な分布の場合インデックスを使うと遅くなるとあるのですが、 >インデックスが有利に働くのはカーディナリティがどのくらいの時からなのでしょうか? サーバスペック次第ですが、以前自分で検証したところでは 全レコードの約10%がヒットする場合にフルスキャンと互角となりました。 (=インデックスで余計なディスクを使うだけ無駄) データを読み込むだけのサイズでただ比較すると、1/8というのを見た記憶があります。 ということで、10%(1~10)位ではインデックスの効果は期待できないです。 一致するデータが約10%を超えるものはフルスキャンが速くなります。 また、 総レコード数が数万件程度の小さなテーブルの場合もインデックスは、ただの足かせになる可能性があります。 ※レコードサイズの大小によりインデックスが有効な場合もあります。
その他の回答 (2)
- GoF
- ベストアンサー率37% (34/91)
CHAR(1)/VARCHAR(1)における、実サイズは1byte NUMBER(1)は、2byte 恐らくCHAR系の方が有利と思われます。 しかし、数千万レコード程度なら誤差の範囲で済むと思います。 速度ではなくデータドメインに適したデータタイプを使用すべきです。 また、 データが平均的な分布であれば、1~6ではカーディナリティが低すぎますので インデックススキャン(B-tree)を使用すると逆に遅くなると思います。
お礼
回答ありがとうございます。 データ件数は100万件程度なので今回はデータの型は 考えない方向でいきたいと思います。 >データが平均的な分布であれば、1~6ではカーディナリティが低すぎますので >インデックススキャン(B-tree)を使用すると逆に遅くなると思います。 データが平均的な分布の場合インデックスを使うと遅くなるとあるのですが、インデックスが有利に働くのはカーディナリティがどのくらいの時からなのでしょうか? 今回のデータは平均的な分布なので気になっています。
- orangemikan
- ベストアンサー率72% (13/18)
インデックスを使用して検索するときは インデックスを検索 ↓ データの入っている行の rowid を取得 ↓ テーブルの rowid を使ってデータを取得 なので今回外の場合はデータ型は検索速度に与える影響はないと思います。 データ件数が多くて必ず 1~6 のどれかが入っていて検索速度を向上させたいならビットマップインデックスも考えてみてはいかがでしょうか?
お礼
回答ありがとうございます。 影響がないとのことなので、今回は気にしないようにすることにしました。 とりあえず、ビットマップインデックスを使ってこれから検証してみたいと思います。
お礼
回答ありがとうございます。 具体的な数字を教えていただき今後も役に立ちそうです。 とても助かりました。