PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Optimasi Kueri di PostgreSQL. JELASKAN Dasar-dasar – Bagian 1

Mengapa dibutuhkan begitu banyak waktu untuk mengeksekusi kueri? Mengapa tidak ada indeks? Kemungkinan Anda pernah mendengar tentang EXPLAIN di PostgreSQL. Namun, masih banyak orang yang tidak tahu cara menggunakannya. Saya harap artikel ini akan membantu pengguna mengatasi alat hebat ini.

Artikel ini adalah revisi penulis dari Understanding EXPLAIN oleh Guillaume Lelarge. Karena saya melewatkan beberapa informasi, saya sangat menyarankan Anda untuk mengenal yang asli.

Iblis tidak sehitam lukisannya

Penting untuk memahami logika kernel PostgreSQL untuk mengoptimalkan kueri. Saya akan mencoba menjelaskan. Ini benar-benar tidak rumit.

EXPLAIN menampilkan informasi yang diperlukan yang menjelaskan apa yang dilakukan kernel untuk setiap kueri tertentu.

Mari kita lihat apa yang ditampilkan oleh perintah EXPLAIN dan pahami apa yang sebenarnya terjadi di dalam PostgreSQL. Anda dapat menerapkan informasi ini ke PostgreSQL 9.2 dan versi yang lebih tinggi.

Tugas kita:

  • Pelajari cara membaca dan memahami output dari perintah EXPLAIN
  • Pahami apa yang terjadi di PostgreSQL saat kueri dijalankan

Langkah pertama

Kami akan berlatih di meja percobaan dengan sejuta baris.

CREATE TABLE foo (c1 integer, c2 text);
INSERT INTO foo
  SELECT i, md5(random()::text)
  FROM generate_series(1, 1000000) AS i;

Coba baca datanya

EXPLAIN SELECT * FROM foo;

Dimungkinkan untuk membaca data dari tabel dalam beberapa cara. Dalam kasus kami, EXPLAIN memberi tahu bahwa Pemindaian Seq digunakan — data tabel Foo yang berurutan, blok demi blok, dibaca.

Apa itu biaya ?

Yah, ini bukan waktu, tetapi konsep yang dirancang untuk memperkirakan biaya operasi. Nilai pertama 0,00 adalah biaya untuk mendapatkan baris pertama. Nilai kedua 18334.00 adalah biaya untuk mendapatkan semua baris.

Baris adalah perkiraan jumlah baris yang dikembalikan saat operasi Seq Scan dilakukan. Penjadwal mengembalikan nilai ini. Dalam kasus saya, ini cocok dengan jumlah baris sebenarnya dalam tabel.

Lebar adalah ukuran rata-rata satu baris dalam byte.

Mari kita coba tambahkan 10 baris.

INSERT INTO foo
  SELECT i, md5(random()::text)
  FROM generate_series(1, 10) AS i;
EXPLAIN SELECT * FROM foo;

Nilai baris belum diubah. Statistik tabel sudah tua. Untuk memperbarui statistik, panggil perintah ANALYZE.

Sekarang, baris menampilkan jumlah baris yang benar.

Apa yang terjadi saat menjalankan ANALYZE?

  • Secara acak, sejumlah baris dipilih dan dibaca dari tabel.
  • Statistik nilai menurut setiap kolom dikumpulkan.

Jumlah baris yang dibaca ANALYZE bergantung pada parameter default_statistics_target.

Data sebenarnya

Semua yang kita lihat di atas dalam output dari perintah EXPLAIN adalah apa yang diharapkan akan didapatkan oleh perencana. Mari kita coba bandingkan dengan hasil pada data aktual. Untuk melakukannya, gunakan EXPLAIN (ANALYZE).

EXPLAIN (ANALYZE) SELECT * FROM foo;

Permintaan seperti itu memang akan dilakukan. Jadi, jika Anda menjalankan EXPLAIN (ANALYZE) untuk pernyataan INSERT, DELETE, atau UPDATE, data Anda akan diubah. Hati-hati! Dalam kasus ini, gunakan perintah ROLLBACK.

Perintah menampilkan parameter tambahan berikut:

  • waktu aktual adalah waktu aktual dalam milidetik yang dihabiskan untuk mendapatkan baris pertama dan semua baris, secara berurutan.
  • baris adalah jumlah sebenarnya dari baris yang diterima dengan Seq Scan.
  • loop adalah berapa kali operasi Seq Scan harus dilakukan.
  • Total runtime adalah total waktu eksekusi kueri.

Bacaan lebih lanjut:

Optimasi Kueri di PostgreSQL. JELASKAN Dasar – Bagian 2

Optimasi Kueri di PostgreSQL. JELASKAN Dasar – Bagian 3


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DAPATKAN DIAGNOSTIK dengan pernyataan COPY dalam fungsi Pl/pgsql

  2. Bagaimana cara mengatur ulang urutan kunci utama postgres ketika tidak sinkron?

  3. Cara membuat Pengguna/Database dalam skrip untuk Docker Postgres

  4. Mengambil semua hak objek untuk peran tertentu

  5. Pemutakhiran Otomatis Cluster PostgreSQL Hampir-Nol di Cloud (Bagian II)