Bagaimana Anda mendapatkan rencana menjelaskan?

10

Bisakah seseorang menjelaskan sedikit tentang menjelaskan rencana, dan bagaimana seseorang mendapatkan rencana menjelaskan untuk kueri. Juga, jika ada skrip sql yang dapat digunakan sebagai utilitas untuk ini, itu akan bagus.

pengguna419534
sumber
1
"Jika ada skrip sql yang dapat digunakan sebagai utilitas untuk ini" jenis utilitas apa yang Anda cari?
Derek Downey
2
Banyak alat pengembangan SQL memiliki GUI yang sangat mudah digunakan untuk mendapatkan rencana eksekusi. Oracle SQL Developer memiliki satu. Apakah Anda memiliki akses ke alat tersebut, atau apakah Anda secara khusus ingin melakukan ini dari skrip?
FrustratedWithFormsDesigner
Saya memiliki Oracle SQL Developer tetapi ingin tahu skrip.
user419534
2
Jika Anda telah mengikuti kursus dengan Jonathan Lewis , maka Anda akan tahu bahwa ada sesuatu seperti 8 cara berbeda untuk mendapatkan rencana eksekusi dari Oracle. Harap pilih komentar ini jika Anda ingin saya menambahkan jawaban yang mencantumkan semua metode yang berbeda.
Colin 't Hart

Jawaban:

9

Anda dapat menggunakan paket DBMS_XPLAN :

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off
Vincent Malgrat
sumber
5

Pernyataan EXPLAIN PLAN menampilkan rencana eksekusi yang dipilih oleh optimizer untuk pernyataan SELECT, UPDATE, INSERT, dan DELETE. Rencana eksekusi pernyataan adalah urutan operasi yang dilakukan database untuk menjalankan pernyataan.

EXPLAIN PLAN FOR ...

Ganti ... dengan Pernyataan SQL Anda. Setelah menjalankan ini jalankan yang berikut untuk melihat paket:

SELECT * FROM table(dbms_xplan.display);

Untuk informasi lebih lanjut, lihat bagian Ikhtisar atau Penggunaan di Oracle 11g Performance Tuning Guide.

Leigh Riffel
sumber
1

Ini adalah pertanyaan yang sangat umum, jadi saya memutuskan untuk mengubah jawaban ini menjadi sebuah artikel .

Perkiraan rencana eksekusi SQL

Perkiraan rencana eksekusi dihasilkan oleh Pengoptimal tanpa menjalankan kueri SQL. Anda dapat membuat estimasi rencana eksekusi dari klien SQL apa pun menggunakan EXPLAIN PLAN FOR FOR atau Anda dapat menggunakan Oracle SQL Developer untuk tugas ini.

JELASKAN RENCANA UNTUK

Saat menggunakan Oracle, jika Anda menambahkan EXPLAIN PLAN FORperintah ke kueri SQL yang diberikan, database akan menyimpan rencana eksekusi yang diperkirakan di terkait PLAN_TABLE:

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Untuk melihat perkiraan rencana eksekusi, Anda perlu menggunakan DBMS_XPLAN.DISPLAY, seperti yang diilustrasikan dalam contoh berikut:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

Opsi pemformatan ALL + OUTLINE memungkinkan Anda untuk mendapatkan lebih detail tentang perkiraan rencana eksekusi daripada menggunakan opsi pemformatan default.

Pengembang Oracle SQL

Jika Anda telah menginstal SQL Developer, Anda dapat dengan mudah mendapatkan estimasi rencana eksekusi untuk setiap query SQL tanpa harus menambahkan terlebih dahulu perintah EXPLAIN PLAN FOR:

masukkan deskripsi gambar di sini

Rencana eksekusi SQL yang sebenarnya

Paket eksekusi SQL aktual dihasilkan oleh Pengoptimal saat menjalankan kueri SQL. Jadi, tidak seperti perkiraan Rencana Eksekusi, Anda perlu mengeksekusi query SQL untuk mendapatkan rencana eksekusi yang sebenarnya.

Rencana aktual seharusnya tidak berbeda secara signifikan dari yang diperkirakan, selama statistik tabel telah dikumpulkan dengan benar oleh basis data relasional yang mendasarinya.

GATHER_PLAN_STATISTICS petunjuk permintaan

Untuk menginstruksikan Oracle untuk menyimpan rencana eksekusi aktual untuk kueri SQL yang diberikan, Anda dapat menggunakan GATHER_PLAN_STATISTICSpetunjuk kueri:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Untuk memvisualisasikan rencana eksekusi aktual, Anda dapat menggunakan DBMS_XPLAN.DISPLAY_CURSOR:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

Aktifkan STATISTIK di tingkat koneksi DB

Jika Anda ingin mendapatkan paket eksekusi untuk semua pertanyaan yang dihasilkan dalam sesi yang diberikan, Anda dapat mengatur STATISTICS_LEVELkonfigurasi sesi untuk SEMUA:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Ini akan memiliki efek yang sama dengan mengatur GATHER_PLAN_STATISTICSpetunjuk kueri pada setiap permintaan eksekusi. Jadi, seperti halnya dengan GATHER_PLAN_STATISTICSpetunjuk kueri, Anda dapat menggunakan DBMS_XPLAN.DISPLAY_CURSORuntuk melihat rencana eksekusi yang sebenarnya.

Anda harus mereset STATISTICS_LEVELpengaturan ke mode default setelah Anda selesai mengumpulkan rencana eksekusi yang Anda minati. Ini sangat penting, terutama jika Anda menggunakan pooling koneksi, dan koneksi database bisa digunakan kembali.

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Vlad Mihalcea
sumber