Dengan mata telanjang: sekilas tentang masalah kueri PostgreSQL

Kami terus membuka untuk akses publik fungsionalitas baru layanan kami untuk menganalisis rencana eksekusi kueri di menjelaskan PostgreSQL.tensor.ru . Hari ini kita akan belajar mengidentifikasi titik sakit begitu saja dalam rencana besar dan kompleks, hanya dengan melihat sekilas dengan mata bersenjata ...





Berbagai opsi visualisasi akan membantu kami dalam hal ini :







Tampilan teks berkurang



Teks asli dari rencana yang agak sederhana sudah menyebabkan masalah dalam analisis:







Oleh karena itu, kami lebih suka bentuk yang disingkat, ketika informasi kunci tentang waktu eksekusi dan buffer yang digunakan dari setiap node dibawa ke kiri dan kanan , dan sangat mudah untuk melihat maksimalnya:







Pie chart



Tetapi kadang-kadang bahkan hanya untuk memahami "di mana yang paling menyakitkan" tidaklah mudah, terutama jika itu berisi beberapa lusin node dan bahkan bentuk rencana yang disingkat membutuhkan 2-3 layar.







Dalam hal ini, diagram lingkaran biasa akan membantu:







Segera, begitu saja, Anda dapat melihat perkiraan pangsa konsumsi sumber daya oleh masing-masing node. Saat kita mengarahkan kursor ke atasnya, di sebelah kiri dalam tampilan teks, kita akan melihat ikon untuk node yang dipilih.



Ubin



Sayangnya, piechart tidak menunjukkan hubungan antara node yang berbeda dan titik "terpanas". Untuk ini, opsi "ubin" jauh lebih cocok:







Diagram eksekusi



Tetapi kedua opsi ini tidak menunjukkan rantai lengkap lampiran node layanan CTE/InitPlain/SubPlan- ini hanya dapat dilihat di diagram eksekusi sebenarnya:







Lebih banyak metrik dibutuhkan!



Jika Anda memotret rencana eksekusi aktual kueri sebagai EXPLAIN (ANALYZE), Anda hanya akan melihat waktu yang telah berlalu di sana . Tetapi seringkali hal ini tidak cukup untuk membuat kesimpulan yang benar!



Misalnya, menjalankan kueri pada cache "dingin", Anda akan menerima (tetapi Anda tidak akan melihat!) Waktu menerima data dari media, dan tidak sama sekali operasi kueri itu sendiri.



Oleh karena itu, beberapa rekomendasi:



  • Gunakan untuk melihat volume halaman data yang dikurangkan. Nilai ini praktis tidak terpengaruh oleh fluktuasi dari beban server itu sendiri dan dapat digunakan sebagai metrik untuk pengoptimalan.EXPLAIN (ANALYZE, BUFFERS)
  • Gunakan track_io_timinguntuk memahami dengan tepat berapa lama waktu yang dibutuhkan untuk bekerja dengan operator .


Dan jika rencana Anda tidak hanya berisi waktu , tetapi juga buffersatau i/o timings, maka pada setiap opsi diagram Anda dapat beralih ke mode analisis untuk metrik ini. Kadang-kadang Anda dapat langsung melihat, misalnya, bahwa lebih dari setengah dari semua bacaan jatuh pada satu simpul masalah:







Artikel sebelumnya tentang topik:






All Articles