FILLFACTOR
Chỉ với INSERT
và SELECT
bạn nên sử dụng FILLFACTOR
trong tổng số 100
ở khắp mọi nơi.
Sẽ không có ích gì khi bạn rời khỏi khoảng trống trên mỗi khối bộ nhớ nếu bạn không định "lung tung" với UPDATE
s.
Cơ chế đằng sau FILLFACTOR
rất đơn giản. INSERT
s chỉ điền vào mỗi trang dữ liệu (thường là một khối 8 kb) theo tỷ lệ phần trăm được khai báo bởi FILLFACTOR
cài đặt. Ngoài ra, bất cứ khi nào bạn chạy VACUUM FULL
hoặc CLUSTER
trên bàn, phòng lung tung giống nhau trên mỗi khối được thiết lập lại. Lý tưởng nhất là điều này cho phép UPDATE
s để lưu trữ các phiên bản hàng mới trong cùng một trang dữ liệu, điều này có thể cung cấp hiệu suất tăng đáng kể khi xử lý nhiều UPDATE
S. Cũng có lợi khi kết hợp với H.O.T. cập nhật :
Nếu có không cập nhật, đừng lãng phí dung lượng cho việc này và đặt FILLFACTOR = 100
.
Nguồn thông tin cơ bản:hướng dẫn về CREATE TABLE
hoặc CREATE INDEX
.
Tối ưu hóa khác
Nhưng bạn có thể làm điều gì đó khác - vì bạn có vẻ là một người mê tối ưu hóa ... :)
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));
Điều này tối ưu hóa bảng của bạn liên quan đến căn chỉnh dữ liệu và tránh padding cho một máy chủ 64 bit điển hình và tiết kiệm một vài byte, có thể chỉ là 8 byte trung bình - bạn thường không thể sử dụng nhiều với "cột tetris:
Ngoài ra, hãy giữ NOT NULL
ở đầu bảng để có phần thưởng hiệu suất rất nhỏ.
Ngoài ra, bảng của bạn có 9 cột . Điều này có nghĩa là thêm 8 byte cho NULL bitmap mở rộng - sẽ vừa với bitmap NULL 1 byte ban đầu cho chỉ 8 cột .
Nếu bạn xác định et_mode
và token
NOT NULL
, tất cả các cột đều NOT NULL
và bitmap NULL được sử dụng, giải phóng 8 byte.
Điều này thậm chí hoạt động trên mỗi hàng nếu bạn không khai báo các cột NOT NULL
. Nếu tất cả các cột có giá trị, không có bitmap NULL cho hàng này. Trong trường hợp của bạn, điều này dẫn đến hiệu ứng nghịch lý khi điền giá trị cho et_mode
và token
có thể làm cho kích thước bộ nhớ của bạn nhỏ hơn hoặc ít nhất là giữ nguyên:
Nguồn thông tin cơ bản: hướng dẫn về Cơ sở dữ liệu lưu trữ vật lý .
So sánh kích thước của các hàng (chứa đầy giá trị) với bảng ban đầu của bạn để có bằng chứng xác thực:
SELECT pg_column_size(t) FROM dev_transactions t;