Optimalkan PostgreSQL untuk banyak pembaruan INSERTS dan bytea

12

Apa yang kami miliki (perangkat lunak):

  • PostrgeSQL 9.3 dengan konfigurasi basis (tidak ada perubahan postgresql.conf)
  • Windows 7 64 bit

Perangkat keras:

  • Intel Core i7-3770 3,9 Ghz
  • RAM 32 Gb
  • WDC WD10EZRX-00L4HBAta Drive (1000Gb, SATA III)

Jadi, kita harus memuat ke DB aprox. 100.000.000 baris dengan kolom bytea , dan 500.000.000 baris lebih sederhana (tanpa LOB). Ada 2 varcharindeks pada tabel 1 (dengan panjang 13, 19) dan 2 varcharindeks pada tabel 2 (panjang 18, 10). Ada juga urutan untuk pembuatan id untuk setiap tabel.

Sekarang operasi ini dilakukan dengan 8 koneksi secara paralel dengan ukuran batch 50 JDBC. Gambar di bawah ini menunjukkan beban sistem: ini adalah beban nol pada postgresqlproses. Setelah 24 jam memuat, kami hanya memuat 10.000.000 baris yang hasilnya sangat lambat.

masukkan deskripsi gambar di sini

Kami meminta bantuan dalam menyetel PostrgreSQLkonfigurasi untuk tujuan:

1) untuk pemuatan data yang sangat cepat ini, ini adalah operasi sekali saja, sehingga bisa jadi konfigurasi sementara

2) untuk mode produksi untuk melakukan jumlah SELECT moderat ke dalam 2 tabel ini dengan indeks mereka tanpa bergabung dan tanpa penyortiran.

Andremoniy
sumber

Jawaban:

14

Untuk insertkinerja, lihat mempercepat kinerja insert di PostgreSQL dan insert massal di PostgreSQL .

Anda membuang-buang waktu Anda dengan JDBC batching untuk insert. PgJDBC tidak melakukan sesuatu yang berguna dengan insertbatch, itu hanya menjalankan setiap pernyataan . <- Ini tidak lagi benar dalam versi PgJDBC yang lebih baru, yang sekarang dapat membuat pernyataan yang telah disiapkan untuk mengurangi waktu pulang-pergi secara signifikan. Tetapi masih lebih baik untuk:

Gunakan COPYsebaliknya; lihat salinan batch PgJDBC dan CopyManager. Adapun jumlah loader konkuren: Bertujuan untuk pasangan per disk, jika operasi disk I / O terikat. Delapan mungkin yang paling Anda inginkan.

Untuk "mode produksi" Anda, saya sarankan memuat sampel data, menyiapkan kueri yang Anda harapkan untuk dijalankan, dan menggunakan explain analyzeuntuk menyelidiki kinerja. Untuk tujuan pengujian saja, gunakan enable_params untuk mengeksplorasi berbagai pilihan paket. Mengatur parameter biaya permintaan perencana ( random_page_cost, seq_page_cost, effective_cache_size, dll) tepat untuk sistem anda, dan pastikan shared_buffersdiatur dengan tepat. Lanjutkan memantau saat Anda menambahkan beban kerja produksi yang disimulasikan, menggunakan auto_explainmodul, log_min_duration_statementpengaturan, pg_stat_statementsekstensi, dll.

Untuk detailnya, lihat manual pengguna PostgreSQL. Saya sarankan muncul kembali di sini ketika Anda memiliki masalah yang lebih konkret dengan explain analyzedetail eksekusi permintaan, dll.

Craig Ringer
sumber
1
Ini jawaban yang menakjubkan! Terima kasih.
Jan Mares