Prestasi PostgreSQL & Pengoptimuman Pertanyaan · Pelajaran

Dalaman TOAST dan Penyimpanan Nilai Besar

Fahami cara PostgreSQL menyimpan lajur yang terlalu besar serta tala pemampatan dan ambang penyimpanan luaran.

Pelajaran 4 daripada 413 langkah

Dalaman TOAST dan Penyimpanan Nilai Besar ialah pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Mengapa TOAST Wujud

PostgreSQL menyimpan baris pada halaman bersaiz tetap, iaitu 8 KB. Satu baris tidak boleh merentasi beberapa halaman, jadi nilai yang lebar (seperti text yang panjang, jsonb yang besar atau bytea) tidak akan muat.

TOAST (The Oversized-Attribute Storage Technique) menyelesaikan masalah ini dengan memampatkan lajur yang terlalu besar dan, jika masih terlalu besar, memotongnya menjadi cebisan yang disimpan dalam jadual sisi berasingan.

  • Mengekalkan baris heap utama supaya kecil dan mesra cache.
  • Membolehkan nilai logik melebihi 8 KB (sehingga kira-kira 1 GB).
  • Berlaku secara automatik dan telus kepada pertanyaan anda.

Ambang TOAST

TOAST mula digunakan apabila jumlah saiz baris melebihi TOAST_TUPLE_THRESHOLD, iaitu 2 KB (satu perempat daripada halaman 8 KB) secara lalai.

Apabila had itu dilepasi, PostgreSQL memampatkan dan/atau memindahkan atribut terbesar yang boleh di-TOAST keluar daripada baris sehingga baris itu muat di bawah TOAST_TUPLE_TARGET (juga kira-kira 2 KB).

Hanya lajur daripada jenis yang panjangnya berubah-ubah (text, varchar, jsonb, bytea, tatasusunan dan sebagainya) boleh di-TOAST. Jenis dengan lebar tetap seperti integer atau timestamptz tidak pernah di-TOAST.

Mencari Jadual TOAST

Setiap jadual yang mempunyai sekurang-kurangnya satu lajur yang boleh di-TOAST akan mendapat jadual TOAST berkaitan yang dinamakan pg_toast.pg_toast_<oid>. Anda boleh mencarinya melalui katalog.

Lajur reltoastrelid menghubungkan relasi heap dengan relasi TOASTnya; nilai 0 bermaksud tiada jadual TOAST dicipta.

SELECT c.relname,
       c.reltoastrelid,
       t.relname AS toast_table
FROM pg_class c
LEFT JOIN pg_class t ON t.oid = c.reltoastrelid
WHERE c.relname = 'documents';

Empat Strategi Storan

Setiap lajur mempunyai strategi storan yang mengawal sama ada lajur itu boleh dimampatkan dan/atau dipindahkan keluar daripada baris:

  • PLAIN — tiada pemampatan dan tiada storan di luar baris; hanya sah untuk jenis yang tidak boleh di-TOAST.
  • EXTENDED — benarkan pemampatan dan storan di luar baris (lalai untuk kebanyakan jenis varlena).
  • EXTERNAL — benarkan storan di luar baris tetapi tiada pemampatan (capaian subrentetan lebih pantas).
  • MAIN — benarkan pemampatan tetapi kekalkan dalam jadual utama kecuali benar-benar perlu.

Memeriksa Storan Setiap Lajur

Buat pertanyaan terhadap pg_attribute.attstorage untuk melihat strategi setiap lajur. Kod tersebut dipetakan seperti berikut: p=PLAIN, e=EXTERNAL, m=MAIN, x=EXTENDED.

SELECT attname,
       atttypid::regtype AS type,
       CASE attstorage
         WHEN 'p' THEN 'plain'
         WHEN 'e' THEN 'external'
         WHEN 'm' THEN 'main'
         WHEN 'x' THEN 'extended'
       END AS storage
FROM pg_attribute
WHERE attrelid = 'documents'::regclass
  AND attnum > 0
  AND NOT attisdropped;

Menukar Strategi Lajur

Gunakan ALTER TABLE ... SET STORAGE untuk mengatasi nilai lalai. Pengoptimuman yang biasa: jika anda kerap membaca subrentetan rawak daripada bytea yang besar (contohnya bacaan julat pada blob), tukar kepada EXTERNAL supaya nilai disimpan tanpa dimampatkan dan boleh diambil sebahagiannya tanpa menyahmampatkan keseluruhan nilai.

Strategi baharu hanya digunakan pada baris yang ditulis selepas perubahan itu; data sedia ada tidak ditulis semula sehingga dikemas kini.

ALTER TABLE documents
  ALTER COLUMN payload SET STORAGE EXTERNAL;

-- Force a rewrite to apply it to existing rows:
VACUUM FULL documents;

Algoritma Pemampatan: pglz berbanding lz4

PostgreSQL memampatkan nilai TOAST sebelum mempertimbangkan storan di luar baris. Dua algoritma tersedia:

  • pglz — algoritma terbina dalam yang lama, nisbah yang baik, tetapi lebih perlahan.
  • lz4 — tersedia sejak PostgreSQL 14, pemampatan/penyahmampatan jauh lebih pantas dengan nisbah yang sedikit lebih rendah. Memerlukan pelayan dibina dengan sokongan lz4.

Lalai seluruh kelompok ditetapkan oleh default_toast_compression.

SHOW default_toast_compression;

-- Set lz4 cluster-wide (postgresql.conf or per session):
SET default_toast_compression = 'lz4';

Pemampatan Setiap Lajur

Mulai PostgreSQL 14, anda boleh menetapkan kaedah pemampatan pada lajur individu dengan SET COMPRESSION. Tetapan ini tidak bergantung pada strategi storan.

Pilih lz4 untuk lajur besar yang kerap digunakan apabila penggunaan CPU semasa membaca/menulis penting; kekalkan pglz atau gunakan EXTERNAL apabila nisbah pemampatan atau capaian subrentetan lebih utama.

ALTER TABLE documents
  ALTER COLUMN body SET COMPRESSION lz4;

-- Inspect chosen method per column:
SELECT attname, attcompression
FROM pg_attribute
WHERE attrelid = 'documents'::regclass
  AND attnum > 0;

Menala Sasaran Storan di Luar Baris

Pilihan relasi toast_tuple_target mengawal sejauh mana PostgreSQL memindahkan atribut keluar daripada baris: ia menetapkan saiz yang ingin dicapai apabila tupel utama dikecilkan (julat sah 128 bait hingga kira-kira 8160).

Menurunkannya menyebabkan lebih banyak nilai dihantar ke TOAST lebih awal, menjadikan heap utama lebih padat dan meningkatkan prestasi imbasan apabila lajur besar jarang dibaca. Menaikkannya mengekalkan lebih banyak data dalam baris.

ALTER TABLE documents
  SET (toast_tuple_target = 512);

-- Verify current reloptions:
SELECT reloptions
FROM pg_class
WHERE relname = 'documents';

Mengukur Jejak TOAST

Gunakan fungsi saiz untuk memisahkan bait jadual utama daripada bait TOAST. Ini memberitahu anda sama ada pengembungan berlaku dalam heap atau dalam nilai yang terlalu besar.

  • pg_table_size — heap + TOAST + TOAST indeksnya, tidak termasuk indeks biasa.
  • pg_relation_size(rel, 'main') — hanya cabang utama.
SELECT
  pg_size_pretty(pg_relation_size('documents'))        AS heap,
  pg_size_pretty(
    pg_total_relation_size(reltoastrelid)
  )                                                     AS toast,
  pg_size_pretty(pg_total_relation_size('documents'))  AS total
FROM pg_class
WHERE relname = 'documents';

Implikasi Praktikal terhadap Prestasi

TOAST tidak kelihatan sehingga kesannya dirasai. Kesan utama yang perlu diingati:

  • Membaca lajur yang di-TOAST mencetuskan carian indeks tambahan ke dalam jadual TOAST dan kemungkinan penyahmampatan — elakkan SELECT * apabila anda hanya memerlukan lajur kecil.
  • Nilai kekal di-TOAST sepanjang kemas kini yang tidak menyentuhnya, jadi kemas kini yang tidak berkaitan adalah murah.
  • EXTERNAL membolehkan bacaan substr() / julat yang cekap pada blob besar yang tidak dimampatkan.
  • Menukar pglz kepada lz4 boleh mengurangkan CPU penulisan dengan ketara untuk beban kerja nilai besar yang banyak melakukan sisipan.

Semakan Pantas

Anda mempunyai jadual yang lajur bytea besarnya kebanyakannya dibaca melalui substr() pada julat bait kecil, dan bacaan ini perlahan kerana setiap capaian menyahmampatkan keseluruhan nilai. Apakah satu perubahan yang paling berkesan untuk membaikinya?

Ringkasan

Anda telah mempelajari cara PostgreSQL mengendalikan nilai yang terlalu besar:

  • TOAST dicetuskan apabila baris akan melebihi ambang kira-kira 2 KB, dengan memampatkan dan kemudian memindahkan lajur varlena yang besar ke dalam jadual pg_toast.*.
  • Empat strategi — PLAIN, MAIN, EXTENDED (lalai), EXTERNAL — mengawal pemampatan dan penempatan di luar baris, yang ditetapkan melalui ALTER TABLE ... SET STORAGE.
  • lz4 (PG14+) menawarkan pemampatan yang lebih pantas berbanding pglz; pilih mengikut lajur dengan SET COMPRESSION atau untuk seluruh kelompok melalui default_toast_compression.
  • toast_tuple_target menala sejauh mana nilai meninggalkan heap; fungsi saiz menunjukkan jumlah storan yang berada dalam TOAST.
  • Pilih EXTERNAL untuk bacaan subrentetan/julat, lz4 untuk nilai besar dengan banyak penulisan, dan elakkan SELECT * untuk mengelakkan penyah-TOAST yang tidak perlu.
Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Dalaman TOAST dan Penyimpanan Nilai Besar” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan, termasuk “Dalaman TOAST dan Penyimpanan Nilai Besar”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Dalaman TOAST dan Penyimpanan Nilai Besar”?

Fahami cara PostgreSQL menyimpan lajur yang terlalu besar serta tala pemampatan dan ambang penyimpanan luaran. Anda berlatih Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Dalaman TOAST dan Penyimpanan Nilai Besar” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan ini?

Ya. Setiap pelajaran Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengukur Penggembungan Jadual dan Indeks dengan Tepat
  2. Mendapatkan Semula Ruang dengan pg_repack
  3. Menala Fillfactor untuk Jadual yang Banyak Dikemas Kini
  4. Dalaman TOAST dan Penyimpanan Nilai Besar
← Kembali ke Prestasi PostgreSQL &amp; Pengoptimuman Pertanyaan