Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Memahami hasil Execute Explain Plan di Oracle SQL Developer

Keluaran EXPLAIN PLAN adalah keluaran debug dari pengoptimal kueri Oracle. BIAYA adalah hasil akhir dari Pengoptimal Berbasis Biaya (CBO), yang tujuannya adalah untuk memilih yang mana dari banyak rencana berbeda yang mungkin harus digunakan untuk menjalankan kueri. CBO menghitung Biaya relatif untuk setiap paket, lalu memilih paket dengan biaya terendah.

(Catatan:dalam beberapa kasus, CBO tidak memiliki cukup waktu untuk mengevaluasi setiap rencana yang mungkin; dalam kasus ini, CBO hanya memilih rencana dengan biaya terendah yang ditemukan sejauh ini)

Secara umum, salah satu kontributor terbesar untuk kueri lambat adalah jumlah baris yang dibaca untuk melayani kueri (memblokir, lebih tepatnya), sehingga biayanya akan didasarkan sebagian pada jumlah baris perkiraan pengoptimal perlu dibaca.

Misalnya, katakanlah Anda memiliki kueri berikut:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(months_of_service kolom memiliki batasan NOT NULL di atasnya dan indeks biasa di atasnya.)

Ada dua paket dasar yang mungkin dipilih oleh pengoptimal di sini:

  • Rencana 1:Baca semua baris dari tabel "karyawan", untuk setiap baris, periksa apakah predikatnya benar (months_of_service=6 ).
  • Rencana 2:Baca indeks di mana months_of_service=6 (ini menghasilkan satu set ROWID), lalu akses tabel berdasarkan ROWID yang dikembalikan.

Bayangkan tabel "karyawan" memiliki 1.000.000 (1 juta) baris. Mari kita bayangkan lebih jauh bahwa nilai untuk month_of_service berkisar dari 1 hingga 12 dan didistribusikan secara merata untuk beberapa alasan.

Biaya Paket 1 , yang melibatkan FULL SCAN, akan menjadi biaya membaca semua baris dalam tabel karyawan, yang kira-kira sama dengan 1.000.000; tetapi karena Oracle akan sering dapat membaca blok menggunakan pembacaan multi-blok, biaya sebenarnya akan lebih rendah (tergantung pada bagaimana database Anda diatur) - mis. mari kita bayangkan jumlah pembacaan multi-blok adalah 10 - biaya yang dihitung dari pemindaian penuh adalah 1.000.000 / 10; Biaya keseluruhan =100.000.

Biaya Paket 2 , yang melibatkan INDEX RANGE SCAN dan pencarian tabel oleh ROWID, akan menjadi biaya pemindaian indeks, ditambah biaya mengakses tabel dengan ROWID. Saya tidak akan membahas bagaimana pemindaian rentang indeks dihitung biayanya, tetapi mari kita bayangkan biaya pemindaian rentang indeks adalah 1 per baris; kami berharap menemukan kecocokan dalam 1 dari 12 kasus, jadi biaya pemindaian indeks adalah 1.000.000 / 12 =83.333; ditambah biaya mengakses tabel (asumsikan 1 blok baca per akses, kami tidak dapat menggunakan pembacaan multi-blok di sini) =83.333; Biaya keseluruhan =166.666.

Seperti yang Anda lihat, biaya Paket 1 (pemindaian penuh) KURANG dari biaya Paket 2 (pemindaian indeks + akses oleh rowid) - yang berarti CBO akan memilih pemindaian LENGKAP.

Jika asumsi yang dibuat oleh pengoptimal di sini benar, maka sebenarnya Paket 1 akan lebih disukai dan jauh lebih efisien daripada Paket 2 - yang menyangkal mitos bahwa pemindaian LENGKAP "selalu buruk".

Hasilnya akan sangat berbeda jika tujuan pengoptimal adalah FIRST_ROWS(n) alih-alih ALL_ROWS - dalam hal ini pengoptimal akan menyukai Paket 2 karena sering kali akan mengembalikan beberapa baris pertama lebih cepat, dengan biaya kurang efisien untuk keseluruhan kueri .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menangani pengecualian to_date dalam pernyataan SELECT untuk mengabaikan baris-baris itu?

  2. Bagaimana cara mengekspor tabel kosong di oracle

  3. Temukan tahun berturut-turut maksimum untuk setiap ID dalam tabel (Oracle SQL)

  4. DBMS_JOB vs DBMS_SCHEDULER

  5. Mencocokkan nilai kolom duplikat Oracle menggunakan Soundex, Jaro Winkler dan Edit Distance (UTL_MATCH)