web-dev-qa-db-ja.com

大きく挿入されたテーブルのインデックスフィルファクターの選択

10の記録を保持するテーブルがあります8 注文。

╔══════════╦═════╦══════╦══════════════════════════╗
║    id    ║  a  ║  b   ║ ...many other columns... ║
╠══════════╬═════╬══════╬══════════════════════════╣
║        1 ║   1 ║  118 ║                      ... ║
║        2 ║   1 ║ 1022 ║                      ... ║
║        3 ║   5 ║  118 ║                      ... ║
║        4 ║   3 ║  118 ║                      ... ║
║      ... ║ ... ║  ... ║                      ... ║
║    10020 ║   5 ║ 1022 ║                      ... ║
║    10021 ║   1 ║  118 ║                      ... ║
║      ... ║ ... ║  ... ║                      ... ║
║  5000000 ║   2 ║   30 ║                      ... ║
║  5000001 ║   1 ║   30 ║                      ... ║
║      ... ║ ... ║  ... ║                      ... ║
║ 28218321 ║   1 ║  118 ║                      ... ║
║ 28218322 ║   4 ║   57 ║                      ... ║
╚══════════╩═════╩══════╩══════════════════════════╝

aは、常に5つの値のいずれかを保持します。列bは、常に〜5000の値の1つを保持します。 abは無関係です。したがって、aのすべての値に対して、少なくとも数千万のテーブル行があり、bのすべての値に対して、少なくとも数十万の行があります。

クエリの多くはWHERE a=<value>またはWHERE b=<value>に基づいているため、これらの列にインデックスを付けています(2つの別々の単一列のbtreeインデックス)。私は、この状況でFILLFACTORを最適に選択する方法を理解しようとしています。

このテーブルは多くのUPDATEを受信しませんが、INSERTの大きなバースト(10のオーダー)を受信します6)短期間で。同時に、適度な一定の読み取り負荷がかかっています。

Btreeインデックスのフィルファクターについての私の理解が正しければ、aおよびbインデックスのフィルファクターがかなり低く、新しい行参照用に多くの空きスペースを追加できるというメリットがあるように思えます。新しいレコードとしてのリーフページには、前のレコードと同じaまたはbの値が含まれます。これは正しいです?

これは低いフィルファクターが有益である状況ですか?もしそうなら、どのおおよその値を使用することを検討する必要がありますか?

1
Alex

B-btreeインデックスの曲線因子は、インデックスの最初の作成時、および新しい最高のキーを挿入するときにのみ使用されます。したがって、これを設定した効果は、ランダムに挿入された非常にアクティブなインデックスでは長くは続きません。これは、開始フィルファクターに依存しない定常状態にすばやく落ち着くためです。曲線因子を変更してからインデックスを再構築すると、パフォーマンスが向上する可能性があります。しかし、インデックスを頻繁に再構築できない限り、それは持続可能な後押しにはなりません。

インデックスの曲線因子は、テーブルの場合とは異なり、あまり一般的には便利なノブではありません。それがまだ存在しておらず、誰かが今それを追加することを提案した場合、彼らはそれを受け入れるのに苦労するかもしれません。

0
jjanes