Ukuran Basis Data Awal PostgreSQL

12

Ada 2 bagian untuk pertanyaan saya.

  1. Apakah ada cara untuk menentukan ukuran awal database di PostgreSQL?
  2. Jika tidak, bagaimana Anda menangani fragmentasi ketika database tumbuh seiring waktu?

Saya baru-baru ini pindah dari MSSQL ke Postgres, dan salah satu hal yang kami lakukan di dunia MSSQL ketika membuat database adalah menentukan ukuran awal dari database dan log transaksi. Ini mengurangi fragmentasi dan peningkatan kinerja, terutama jika ukuran "normal" dari database diketahui sebelumnya.

Kinerja basis data saya menurun seiring bertambahnya ukuran. Misalnya, beban kerja yang saya lakukan biasanya memakan waktu 10 menit. Ketika basis data tumbuh, waktu ini meningkat. Melakukan VACUUM, VACUUM FULL dan VACUUM FULL ANALYZE tampaknya tidak menyelesaikan masalah. Apa yang memecahkan masalah kinerja menghentikan database, de-fragmenting drive dan kemudian melakukan VACUUM FULL ANALYZE membawa kinerja pengujian saya kembali ke 10 menit semula. Ini membuat saya curiga bahwa fragmentasi inilah yang menyebabkan saya sakit.

Saya tidak dapat menemukan referensi untuk memesan tablespace / ruang database di Postgres. Entah saya menggunakan terminologi yang salah dan dengan demikian tidak menemukan apa-apa, atau ada cara yang berbeda untuk mengurangi fragmentasi sistem file di Postgres.

Ada petunjuk?

Solusinya

Jawaban yang diberikan membantu mengonfirmasi apa yang mulai saya curigai. PostgreSQL menyimpan database di banyak file dan inilah yang memungkinkan database untuk tumbuh tanpa khawatir akan fragmentasi. Perilaku default adalah mengemas file-file ini hingga penuh dengan data tabel, yang baik untuk tabel yang jarang berubah tetapi buruk untuk tabel yang sering diperbarui.

PostgreSQL menggunakan MVCC untuk menyediakan akses bersamaan ke data tabel. Di bawah skema ini, setiap pembaruan membuat versi baru dari baris yang telah diperbarui (ini bisa melalui cap waktu atau nomor versi, siapa tahu?). Data lama tidak segera dihapus, tetapi ditandai untuk dihapus. Penghapusan aktual terjadi ketika operasi VACUUM dilakukan.

Bagaimana ini berhubungan dengan faktor pengisian? Faktor pengisian tabel default 100 sepenuhnya mengemas halaman tabel, yang pada gilirannya berarti bahwa tidak ada ruang di dalam halaman tabel untuk menahan baris yang diperbarui, yaitu baris yang diperbarui akan ditempatkan di halaman tabel yang berbeda dari baris asli. Ini buruk untuk kinerja, seperti yang ditunjukkan oleh pengalaman saya. Karena tabel ringkasan saya sering diperbarui (hingga 1500 baris / detik), saya memilih untuk menetapkan faktor pengisian 20, yaitu 20% dari tabel akan untuk data baris yang dimasukkan dan 80% untuk data pembaruan. Meskipun ini mungkin tampak berlebihan, jumlah besar ruang yang disediakan untuk baris yang diperbarui berarti bahwa baris yang diperbarui tetap berada dalam halaman yang sama dengan yang asli dan ada halaman tabel yang tidak penuh pada saat daemon autovacuum berjalan untuk menghapus baris yang usang.

Untuk "memperbaiki" database saya, saya melakukan yang berikut ini.

  1. Atur faktor isi tabel ringkasan saya ke 20. Anda dapat melakukan ini pada waktu pembuatan dengan mengirimkan parameter ke CREATE TABLE , atau setelah faktanya melalui ALTER TABLE. Saya mengeluarkan perintah plpgsql berikut:ALTER TABLE "my_summary_table" SET (fillfactor = 20);
  2. Mengeluarkan VACUUM FULL, karena ini menulis versi yang sama sekali baru dari file tabel dan oleh karena itu menulis file tabel baru dengan faktor isian baru .

Menjalankan kembali pengujian saya, saya tidak melihat penurunan kinerja bahkan ketika database sebesar yang saya butuhkan dengan jutaan baris.

TL; DR - Fragmentasi file bukan penyebabnya, itu adalah fragmentasi ruang tabel. Ini dimitigasi dengan mengubah faktor pengisian tabel agar sesuai dengan kasus penggunaan khusus Anda.

CadentOrange
sumber
Saya ragu bahwa ini adalah operasi pengubahan ukuran file. Dugaan saya adalah bahwa mempertahankan indeks adalah apa yang memperlambat sisipan. Ada diskusi saat ini di milis PG tentang hal ini (meskipun tanpa solusi): postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name

Jawaban:

4
  1. Tidak ada satu-satunya hal yang dekat dengan itu adalah ketika Anda mengkompilasi server dengan saklar --with-segsize, ini mungkin membantu jika meja Anda mengambil lebih banyak ruang daripada pertunjukan dan sistem file Anda dapat menangani satu file berada di atas pertunjukan. Jika Anda memasukkan 20 gigs, Anda harus membuat 20 file jika Anda tidak menggunakan sakelar ini. Jika sistem file Anda dapat menangani file lebih dari satu pertunjukan Anda hanya dapat mengaturnya ke nilai besar kemungkinan besar melihat beberapa manfaat, terburuk jika manfaat kecil.

  2. Lihatlah CLUSTER http://www.postgresql.org/docs/9.1/static/sql-cluster.html dan FILLFACTOR http://www.postgresql.org/docs/9.1/static/sql-createtable.html , http://www.postgresql.org/docs/9.1/static/sql-createindex.html

Perhatikan bahwa FILLFACTOR dapat diterapkan pada tabel dan indeks.

Kuberchaun
sumber
5

Ada hal lain yang sedang dimainkan yang belum memasukkan persamaan Anda: Pembaruan HOT . Jawaban terkait:

Pengaturan FILLFACTORke level 20 yang tampaknya berlebihan. Ini menggembungkan meja hingga lima kali ukurannya. Jika pembaruan HOT bekerja, Anda tidak harus pergi serendah itu - biasanya .

Ada pengecualian: Pembaruan HOT hanya dapat menggunakan kembali tupel mati dari transaksi sebelumnya , bukan dari yang sama atau bersamaan . Oleh karena itu, beban serentak yang berat atau transaksi yang panjang berulang kali memperbarui baris yang sama dapat menjamin pengaturan rendah (atau bahkan lebih rendah).

Jika Anda memiliki pembaruan besar, mengubah sebagian besar tabel sekaligus, Anda mungkin ingin membaginya dalam beberapa potongan, idealnya hanya mengubah banyak baris sekaligus sesuai secara lokal di halaman data. Tapi itu sulit untuk diperkirakan dan diatur.

Perhatikan bahwa pembaruan HOT hanya berfungsi ketika kolom yang diubah tidak terlibat dalam indeks dengan cara apa pun (baik sebagai data maupun sebagai kondisi dalam indeks parsial). Anda mungkin memblokir pembaruan HOT dengan indeks pada kolom yang diperbarui. Jika itu bisa dibuang, Anda mungkin mendapatkan kinerja keseluruhan yang lebih baik tanpa mereka.

Akhirnya, Anda dapat mengatur parameter autovacuum per tabel . Anda dapat menargetkan tabel yang sangat diperbarui dengan pengaturan agresif memungkinkan pengemasan baris yang lebih ketat daripada hanya FILLFACTOR 20.

Erwin Brandstetter
sumber
1
Hal-hal yang menarik, saya akan membacanya dan mencoba untuk mendapatkan pemahaman yang lebih baik tentang apa arti pembaruan HOT untuk sistem saya.
CadentOrange
4

Jika masalah Anda adalah fragmentasi file maka tidak, tidak ada. Di Postgres, setiap tabel mendapatkan file sendiri, atau set file jika menggunakan TOAST, dalam sistem file. Ini berbeda dari, katakanlah, Oracle (atau tampaknya MS-SQL) di mana Anda membuat file tablespace pre-size untuk menjatuhkan tabel Anda ke - meskipun bahkan di sana Anda bisa memiliki masalah fragmentasi sistem file jika file tablespace diperluas atau sistem file awalnya terfragmentasi.

Mengenai pertanyaan kedua Anda ... Saya tidak tahu bagaimana cara menangani fragmentasi sistem file dengan bersih karena MS-Windows adalah satu-satunya OS di mana saya mengalami masalah fragmentasi dan saya tidak menjalankan MS-Windows lebih dari sekadar perlu hari ini. Mungkin menempatkan file database pada disk mereka sendiri dapat mengurangi itu sampai batas tertentu.

gsiems
sumber
Perlu diingat Anda memiliki fragmentasi basis data PostgreSQL internal dan Anda memiliki fragmentasi sistem file eksternal. Internal saya percaya dapat dikurangi dengan VACUUM dan menggunakan CLUSTERS dan FILLFACTOR. Sistem file dapat ditangani dengan menjalankan defrag untuk sistem file yang diberikan. Dan sistem file Linux / Unix dapat menjadi terfragmentasi beberapa kali tergantung pada beban kerja dan jenis sistem file.
Kuberchaun
Fragmentasi sistem file sebenarnya bukan masalah besar dengan NTFS saat ini.
a_horse_with_no_name
1
Saya pikir NTFS terkenal karena itu? Mesin workstation saya terfragmentasi dengan cukup baik, satu-satunya hal yang membuatnya terkendali adalah defrag terjadwal yang dijalankan Windows7 setiap hari.
Kuberchaun