Saya memiliki dua server yang identik (dalam hal perangkat keras), keduanya adalah instalasi standar windows server 2008 r2, dengan perangkat lunak minimal yang diinstal (pada dasarnya kode saya dan hal-hal yang diperlukan seperti jvm dll).
Di satu server, saya menjalankan sql server 2005, pada server kedua postgresql 9.1. Perbedaan kinerja antara 2 server ini sangat mengejutkan, ini sangat buruk pada postgresql sehingga saya menyesali pidato awal saya "mari kita gunakan postgresql alih-alih membayar lisensi server sql" kepada bos saya. Kita berbicara perbedaan 30 detik vs 15 menit untuk perintah yang sama, dan itu bukan hanya perintah yang satu ini, itu adalah pertanyaan atau perintah yang saya berikan. Keduanya memiliki data yang hampir sama (catatan dimasukkan dalam urutan yang berbeda), dan kedua database memiliki struktur / indeks yang sama persis dll.
Tapi saya berharap ini hanya masalah penyesuaian kinerja. Masalahnya adalah, sql server cukup banyak menggunakan semua 32 pertunjukan ram di server, sedangkan postgresl tidak menggunakan apa-apa, pasti kurang dari satu pertunjukan meskipun saya belum benar-benar mengetahuinya secara detail.
Bagaimana cara mendapatkan postgresql menggunakan 20+ pertunjukan ram? Server-server ini dibangun khusus untuk hal-hal basis data ini, jadi setiap ram yang tidak digunakan oleh database dan proses pendukung terbuang sia-sia menurut saya.
sumber
SET effective_cache_size=18G;
(pengaturan default sangat rendah) BTW: dengan asumsi ini adalah mesin 64 bit (tidak ada PTE)Jawaban:
Ada banyak konstanta tweakable, diinisialisasi melalui
postgres.conf
. Yang paling penting adalah:max_connections
: jumlah sesi bersamaanwork_mem
: jumlah maksimal memori yang akan digunakan untuk hasil antara seperti tabel hash, dan untuk menyortirshared_buffers
jumlah memori yang didedikasikan untuk ruang buffer 'yang disematkan'.effective_cache_size
jumlah memori yang diasumsikan digunakan oleh buffer LRU OS.random_page_cost
: perkiraan untuk biaya relatif dari pencarian disk.max_connections
tidak boleh ditetapkan lebih tinggi dari yang dibutuhkan, koneksi sumber daya biaya bahkan ketika idle; dalam kebanyakan kasus koneksi akan menghabiskan lebih banyak waktu menunggu di dalam daripada menunggu di luar. (dengan harga konkurensi) Formula aturan praktis yang bagus adalah "jumlah spindel + jumlah prosesor + X"work_mem
rumit: dapat diterapkan ke setiap subquery, jadi kueri dengan 5HASHJOINS
mungkin berharga 5 *work_mem
. Dan untuk skenario terburuk, Anda juga harus memikirkan beberapa sesi mengkonsumsi jumlah ini (sekali lagi alasan untuk tetapmax_connections
rendah).shared_buffers
adalah (IMHO) berlebihan. Biasanya disarankan untuk mengaturnya menjadi sekitar 1/4 ... 1/2 dari semua memori "bebas" yang tersedia, tetapi saya cenderung menyimpannya rendah, dan mengatureffective_cache_size
ke semua memori "bebas" yang tersedia.random_page_cost
adalah biaya pencarian + baca pada disk. Ini relatif terhadapsequential_disk_cost
, yaitu 1. Default (4) untukrandom_page_cost
diatur terlalu tinggi untuk mesin modern dan penyimpanan jaringan, biasanya dapat diturunkan menjadi antara 2 dan 1.x. Untuk disk SSD Anda bahkan dapat mengaturnya ke 1.0, karena mencari hampir gratis di SSD.sumber
work_mem
ketikamax_connections
default 100 dan RAM server 32GB (dedicated postgres server)? Saya tahu saya harus menyetel ini sendiri berdasarkan permintaan harian. Saya hanya ingin tahu apakah Anda dapat memberi saya nilai "satu ukuran cocok untuk semua jawaban" (atau nilai titik awal). Apakah 50MB terlalu besar? Terima kasih banyak.Pertimbangkan untuk menggunakan pgtune untuk membantu Anda mengatur konfigurasi PostgreSQL. Dari PgFoundry:
Konfigurasi default PostgreSQL sangat konservatif dan alat itu dimaksudkan untuk membantu dengan situasi yang tepat ini. Dokumentasinya ringan dibaca dan menggunakan alat ini sangat mudah.
Ingatlah bahwa tidak perlu menggunakan saran persis pgtune. Bermain dengan pengaturannya dan menonton perubahan yang dihasilkan pada file conf akan memberi Anda pemahaman yang lebih baik tentang konfigurasi PostgreSQL dan cara men-tweak secara manual.
sumber
Jika setiap permintaan atau perintah berjalan lambat saya curiga bahwa:
Bisakah Anda memberi tahu kami berapa banyak waktu yang diperlukan untuk menjalankan kueri
select version()
? Jika harus instan (0,16 ms di workstation saya).sumber
Jika SETIAP permintaan adalah sesuatu yang jauh lebih lambat sangat salah dengan server atau sesuatu. Dalam pengalaman saya masing-masing db memiliki beberapa hal itu lebih baik daripada yang lain, tetapi kinerja pgsql bijaksana mudah di bidang yang sama dengan server mssql.
Jadi, OS apa yang Anda jalankan pgsql? Perangkat keras apa? Pengaturan apa yang sudah Anda ubah? Seberapa besar dataset Anda? Apa contoh dari kueri yang buruk dan output dari analisis menjelaskan (Jalankan permintaan Anda seperti ini:
jelaskan analisis pilih ... sisa kueri di sini ...;
Poskan hasilnya ke http://explain.depesz.com/ dan poskan tautannya di sini.
sumber