PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Faktor pengisian untuk indeks sekuensial yaitu PK

FILLFACTOR

Hanya dengan INSERT dan SELECT anda harus menggunakan FILLFACTOR dari 100 di mana-mana.

Tidak ada gunanya meninggalkan ruang gerak per blok memori jika Anda tidak akan "bergoyang" dengan UPDATE s.

Mekanisme di balik FILLFACTOR sangat sederhana. INSERT s hanya mengisi setiap halaman data (biasanya blok 8 kb) hingga persentase yang dinyatakan oleh FILLFACTOR pengaturan. Juga, setiap kali Anda menjalankan VACUUM FULL atau CLUSTER di atas meja, ruang gerak yang sama per blok dibangun kembali. Idealnya, ini memungkinkan UPDATE s untuk menyimpan versi baris baru di halaman data yang sama, yang dapat memberikan peningkatan kinerja yang substansial saat menangani banyak UPDATE s. Juga bermanfaat dalam kombinasi dengan H.O.T. pembaruan :

Jika ada tidak pembaruan, jangan buang ruang untuk ini dan atur FILLFACTOR = 100 .

Sumber informasi dasar:manual tentang CREATE TABLE atau CREATE INDEX .

Pengoptimalan lainnya

Tapi Anda bisa melakukan sesuatu yang lain - karena Anda tampaknya payah dalam pengoptimalan ... :)

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));

Ini mengoptimalkan tabel Anda terkait dengan penyelarasan data dan menghindari pengisi untuk server 64 bit biasa dan menyimpan beberapa byte, mungkin rata-rata hanya 8 byte - Anda biasanya tidak dapat memeras banyak dengan "tetris kolom:

Juga, simpan NOT NULL kolom di awal tabel untuk bonus kinerja yang sangat kecil.

Juga, tabel Anda memiliki 9 kolom . Ini berarti tambahan 8 byte untuk NULL bitmap . yang diperluas - yang akan cocok dengan bitmap NULL 1-byte awal hanya untuk 8 kolom .
Jika Anda mendefinisikan et_mode dan token NOT NULL , semua kolom adalah NOT NULL dan bitmap NULL digunakan sama sekali, membebaskan 8 byte.
Ini bahkan berfungsi per baris jika Anda tidak mendeklarasikan kolom NOT NULL . Jika semua kolom memiliki nilai, tidak ada bitmap NULL untuk baris ini. Dalam kasus Anda, ini mengarah pada efek paradoks yang mengisi nilai untuk et_mode dan token dapat membuat ukuran penyimpanan Anda lebih kecil atau setidaknya tetap sama:

Sumber informasi dasar:manual tentang Penyimpanan Fisik Database .

Bandingkan ukuran baris (diisi dengan nilai) dengan tabel asli Anda untuk mendapatkan bukti yang pasti:

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. Masalah penyortiran postgres

  2. psycopg2 setara dengan mysqldb.escape_string?

  3. CURSOR yang dihasilkan secara dinamis di Postgresql

  4. ActiveRecord::StatementInvalid:PG InFailedSqlTransaction

  5. postgresql bergabung sendiri