PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Hệ số lấp đầy cho một chỉ số tuần tự là PK

FILLFACTOR

Chỉ với INSERTSELECT 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_modetoken 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_modetoken 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql:Tại sao tôi phải chỉ định -h localhost khi chạy psql?

  2. [Video] Giới thiệu về các kiểu dữ liệu JSON trong PostgreSQL

  3. Truy vấn phụ SQL trong kiểm tra ràng buộc

  4. Làm cách nào để thay đổi định dạng cho các giá trị trả về của tôi trong hàm này?

  5. Đơn giản hóa trường hợp lồng nhau khi câu lệnh