Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Pengantar auto_explain:Cara Mencatat Rencana Kueri Postgres Lambat Secara Otomatis

Apakah Anda ingin tahu mengapa kueri PostgreSQL lambat? Maka EXPLAIN ANALYZE adalah titik awal yang bagus. Tetapi rencana kueri dapat bergantung pada aktivitas server lain, dapat memakan waktu cukup lama untuk dijalankan, dan dapat berubah seiring waktu, jadi jika Anda ingin melihat rencana eksekusi sebenarnya dari kueri paling lambat Anda, auto_explain adalah alat yang Anda butuhkan. Dalam postingan ini, kita akan melihat fungsinya, cara mengonfigurasinya, dan cara menggunakan log tersebut untuk mempercepat kueri Anda.

Apa itu auto_explain?

auto_explain adalah ekstensi PostgreSQL yang memungkinkan Anda mencatat rencana kueri untuk kueri lebih lambat dari ambang batas (yang dapat dikonfigurasi). Ini sangat berguna untuk men-debug kueri lambat, terutama yang terkadang bermasalah. Ini adalah salah satu modul kontribusi, sehingga dapat diinstal dan dikonfigurasi dengan mudah di PostgreSQL biasa, dan sangat berguna sehingga kami mengaktifkannya secara default di ScaleGrid.

Terima kasih yang sebesar-besarnya kepada Takahiro Itagaki, penulis utama di balik versi pertama auto_explain (commit, thread), Dean Rasheed, yang menjadi dasar patch dan saran awalnya, dan banyak lagi kontributor dan pengulas sejak itu.

Parameter auto_explain mana yang harus saya gunakan?

Di bawah ini kita akan membahas parameter yang paling penting, tetapi harap tinjau tabel di bawah, atau dokumentasi resmi, untuk informasi selengkapnya tentang rangkaian lengkap hal yang dapat Anda lacak.

Parameter terpenting untuk auto_explain adalah log_min_duration . Secara default ini diatur ke -1 , yang berarti tidak ada yang akan dicatat – jadi jika kita ingin beberapa log, kita perlu mengubahnya! Unit default adalah ms, jadi pengaturan 100 akan mencatat rencana kueri untuk semua kueri yang melebihi 100 md. Inilah yang kami pilih sebagai default di ScaleGrid, tetapi dapat dikonfigurasi di bawah Admin -> Config. Jika, karena alasan tertentu, Anda ingin mencatat rencana kueri untuk setiap kueri, Anda dapat menyetelnya ke 0 – tetapi berhati-hatilah, ini dapat memiliki implikasi kinerja yang parah.

Karena kueri sudah dieksekusi di server, Anda mungkin juga ingin mengaktifkan auto_explain.log_analyze . Ini membuat output setara dengan menjalankan EXPLAIN ANALYZE . Secara default, ini juga berarti bahwa pengaturan waktu per operasi dilacak. Ini disertai dengan beberapa overhead tambahan, yang dapat diminimalkan dengan mematikan auto_explain.log_timing (diaktifkan secara default dengan log_analyze ). Tentu saja, pengaturan waktu per operasi sangat berguna saat men-debug kueri lambat! Pengujian internal kami menunjukkan overhead yang dapat diterima untuk ini, jadi ini diaktifkan secara default di ScaleGrid, tetapi seperti biasa, harap uji beban kerja Anda untuk melihat apakah overhead dapat diterima dalam kasus Anda. Saat ini ada informasi terbatas yang tersedia untuk umum tentang topik ini, tetapi posting terbaru oleh tim pgMustard menunjukkan bahwa, setidaknya pada beban kerja transaksional kecil, overhead dapat serendah 2%. Seperti yang mereka catat, ini dapat dikurangi dengan auto_explain.sample_rate parameter, dengan biaya hanya melacak sebagian kueri Anda.

Parameter terakhir yang akan kita bahas secara mendetail adalah auto_explain.log_format . Keluaran defaultnya adalah TEXT, yang mungkin paling Anda kenal dari penggunaan EXPLAIN .

Berikut adalah contoh sederhana seperti apa output auto_explain dalam format TEXT:

2021-09-10 15:32:04.606 BST [22770] LOG:  duration: 3184.383 ms  plan:
	Query Text: select * from table1 order by column1;
	Sort  (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1)
	  Sort Key: column1
	  Sort Method: external merge  Disk: 4696kB
	  Buffers: shared hit=837, temp read=587 written=589
	  ->  Seq Scan on table  (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1)
	        Buffers: shared hit=834

Anda dapat melihat di sini bahwa Anda mendapatkan durasi kueri di awal, yang biasanya Anda lihat di akhir rencana kueri. Anda juga akan melihat teks kueri, termasuk parameter apa pun.

Alat visualisasi populer explain.depesz dan explain.dalibo keduanya menerima rencana kueri dalam format TEXT, tetapi keduanya juga mendukung format JSON. Jika beberapa tim Anda lebih suka menggunakan alat seperti PEV dan pgMustard, yang hanya mendukung format JSON, Anda mungkin ingin menetapkannya sebagai format. Untuk pelanggan di ScaleGrid, kami memilih format JSON, sebagian karena kami ingin menguraikannya dengan lebih mudah untuk fitur analisis kueri lambat kami sendiri.

Berikut adalah daftar lengkap parameter auto_explain, dan defaultnya:

Parameter Default PostgreSQL Default ScaleGrid
auto_explain.log_min_duration -1 100
auto_explain.log_analyze Nonaktif Aktif
auto_explain.log_timing Aktif (dengan log_analyze) Aktif
auto_explain.log_buffers Nonaktif Aktif
auto_explain.log_verbose Nonaktif Aktif
auto_explain.log_triggers Nonaktif Nonaktif
auto_explain.log_nested_statements Nonaktif Nonaktif
auto_explain.log_settings (v12) Nonaktif Nonaktif
auto_explain.log_wal (v13) Nonaktif Nonaktif
auto_explain.log_format TEXT JSON
auto_explain.log_level LOG LOG
auto_explain.sample_rate 1 1

Menginstal auto_explain

Pada ScaleGrid, auto_explain diaktifkan secara default, dengan ambang 100ms. Anda dapat mengonfigurasi ini di Admin -> Config.

Pada vanilla PostgreSQL, Anda dapat menginstal auto_explain hanya dengan menambahkannya ke salah satu session_preload_libraries atau shared_preload_libraries . Yang pertama memiliki keuntungan dari a) tidak memerlukan restart (tetapi hanya akan dimuat di sesi baru) dan b) memungkinkan untuk mengaktifkannya hanya untuk beberapa pengguna (dengan mengatur parameter ini dengan ALTER ROLE SET ).

Dengan demikian, konfigurasi dasar untuk auto_explain dapat terlihat seperti ini:

session_preload_libraries = auto_explain
auto_explain.log_min_duration = 100
auto_explain.log_analyze = true
auto_explain.log_buffers = true
auto_explain.log_format = JSON

Jika Anda menggunakan penyedia hosting yang berbeda, ada baiknya memeriksa apakah mereka mendukung auto_explain. Misalnya, RDS Postgres melakukannya, tetapi tidak seperti ScaleGrid, ini tidak aktif secara default, jadi Anda harus mengedit konfigurasi untuk menjalankannya.

Memuat auto_explain ke dalam satu sesi

Jika Anda tidak ingin auto_explain berjalan dalam sesi secara otomatis, sebagai pengguna super, Anda juga memiliki opsi untuk memuatnya ke dalam satu sesi:

LOAD 'auto_explain';

Ini bisa sangat berguna untuk sesi debugging satu kali tetapi tentu saja tidak diperlukan jika Anda sudah dapat menjalankannya.

auto_explain batasan dan gotcha

Kami telah menyebutkan beberapa di antaranya secara sepintas, tetapi tampaknya saat yang tepat untuk mengingatkan diri kita sendiri tentang beberapa kelemahan dan keterbatasan auto_explain.

Pertama, terutama saat melacak pengaturan waktu per operasi, mungkin ada overhead terukur untuk menggunakan auto_explain. Ini bisa rendah, bahkan dengan pengaturan waktu yang diukur, tetapi seperti biasa, ada baiknya melakukan pengujian Anda sendiri.

Kedua, pengaturan waktu auto_explain tidak termasuk waktu perencanaan kueri. Waktu perencanaan seringkali kecil pada kueri yang lambat, tetapi dalam kasus luar biasa, ini dapat bertanggung jawab atas sebagian besar masalah. Karena itu, ingatlah bahwa kasus ini mungkin tidak muncul di log Anda, atau jika memang demikian, perbedaan dengan apa yang Anda lihat dalam latensi total mungkin berkaitan dengan waktu perencanaan. Panduan EXPLAIN ANALYZE akan segera membantu Anda menemukan ini.

Cara menggunakan output penjelasan untuk mempercepat kueri

Setelah Anda memiliki output penjelasan untuk kueri paling lambat, Anda sekarang dapat mulai mencari cara untuk mempercepatnya!

Anda harus mengeluarkan rencana kueri dari log, yang dapat digunakan pgBadger jika Anda tidak menggunakan layanan terkelola yang melakukannya untuk Anda.

Meninjau rencana EXPLAIN adalah topik besar tersendiri. Dokumentasi PostgreSQL mencakup pengantar yang bagus namun singkat untuk menggunakan EXPLAIN, dan artikel Thoughbot tentang membaca EXPLAIN ANALYZE adalah langkah selanjutnya yang baik. Jika Anda lebih suka berbicara selama satu jam, EXPLAIN Explained oleh Josh Berkus sangat bagus. Untuk informasi lebih lanjut, Depesz memiliki serangkaian postingan berjudul Explaining the unexplainable dan tim pgMustard memiliki EXPLAIN Glossary yang cukup lengkap.

Jika Anda memerlukan bantuan dari pakar PostgreSQL untuk mengelola database dan mempercepat kueri lambat Anda, cobalah ScaleGrid. Kami menyediakan dukungan tingkat perusahaan 24/7 gratis yang dapat memandu Anda melalui kueri lambat ini dan membantu Anda mengoptimalkan semuanya. Uji coba gratis kami selama 30 hari memberi Anda banyak waktu untuk mencoba banyak fitur kami untuk PostgreSQL dan database lain yang didukung.

Kami harap ini memberi Anda semua yang Anda butuhkan untuk memulai auto_explain dan mulai mempercepat kueri lambat apa pun yang Anda miliki. Jika ada hal lain yang ingin Anda ketahui, hubungi kami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan isql dengan String Koneksi

  2. Kumpulan Masalah 1 – Mengidentifikasi Entitas

  3. Bekerja dengan Data Java di Sisense

  4. Kejutan dan Asumsi Kinerja :SET NOCOUNT ON

  5. Cara Menambahkan Kolom di SQL