FILLFACTOR
INSERT
のみ およびSELECT
FILLFACTOR
を使用する必要があります 100
の どこでも。
UPDATE
で「ウィグル」しない場合は、メモリブロックごとにウィグルルームを残しても意味がありません。 s。
FILLFACTOR
の背後にあるメカニズム とてもシンプルです。 INSERT
■FILLFACTOR
によって宣言されたパーセンテージまで、各データページ(通常は8 kbブロック)のみを埋めます。 設定。また、VACUUM FULL
を実行するたびに またはCLUSTER
テーブルの上で、ブロックごとに同じ小刻みに動く部屋が再確立されます。理想的には、これによりUPDATE
が可能になります ■新しい行バージョンを同じデータページに保存します。これにより、大量のUPDATE
を処理するときにパフォーマンスが大幅に向上します。 s。 H.O.T。との組み合わせでも有益です更新 :
ない場合 更新、これのためにスペースを無駄にしないで、FILLFACTOR = 100
を設定してください 。
基本的な情報源: CREATE TABLE
またはCREATE INDEX
。
その他の最適化
ただし、他のことを行うことはできます -あなたは最適化の吸血鬼のようですので...:)
CREATE TABLE dev_transactions
( transaction_id serial PRIMARY KEY,
gateway integer NOT NULL,
moment timestamp NOT NULL,
transaction_type smallint NOT NULL,
status smallint NOT NULL,
device integer NOT NULL,
controler smallint NOT NULL,
token integer,
et_mode character(1));
これにより、データアライメントに関してテーブルが最適化されます パディングを回避します 典型的な64ビットサーバーの場合、数バイト、おそらく平均でわずか8バイトを節約します。通常、「列テトリス:
」では、多くを絞り出すことはできません。
また、NOT NULL
を維持します 非常に小さなパフォーマンスボーナスのために、テーブルの先頭にある列。
また、テーブルには9列があります 。これは、余分な8バイトを意味します 拡張されたNULLビットマップの場合 -これは、8列の最初の1バイトのNULLビットマップに収まります。 。et_mode
を定義する場合 およびtoken
NOT NULL
、すべての列はNOT NULL
NULLビットマップが使用され、8バイトが解放されます。
これは、列をNOT NULL
と宣言しない場合でも、行ごとに機能します。 。すべての列に値がある場合、この行のNULLビットマップはありません。あなたの場合、これはet_mode
の値を入力するというパラドックス効果につながります およびtoken
ストレージサイズを小さくすることができます または少なくとも同じまま:
基本的な情報源:データベースの物理ストレージに関するマニュアル 。
行のサイズ(値で埋められている)を元のテーブルと比較して、明確な証拠を取得します。
SELECT pg_column_size(t) FROM dev_transactions t;