Di Microsoft SQL Server bagaimana saya bisa mendapatkan rencana eksekusi permintaan untuk prosedur query / tersimpan?
338
Di Microsoft SQL Server bagaimana saya bisa mendapatkan rencana eksekusi permintaan untuk prosedur query / tersimpan?
Jawaban:
Ada sejumlah metode untuk mendapatkan rencana eksekusi, yang akan digunakan tergantung pada keadaan Anda. Biasanya Anda dapat menggunakan SQL Server Management Studio untuk mendapatkan paket, namun jika karena alasan tertentu Anda tidak dapat menjalankan kueri di SQL Server Management Studio maka Anda mungkin merasa terbantu untuk dapat memperoleh paket melalui SQL Server Profiler atau dengan memeriksa cache rencana.
Metode 1 - Menggunakan SQL Server Management Studio
SQL Server hadir dengan beberapa fitur rapi yang membuatnya sangat mudah untuk menangkap rencana eksekusi, cukup pastikan bahwa item menu "Sertakan Rencana Eksekusi Aktual" (ditemukan di bawah menu "Permintaan") dicentang dan jalankan kueri Anda seperti biasa .
Jika Anda mencoba untuk mendapatkan rencana eksekusi untuk pernyataan dalam prosedur tersimpan, maka Anda harus menjalankan prosedur tersimpan, seperti:
Ketika kueri Anda selesai, Anda akan melihat tab tambahan berjudul "Rencana eksekusi" muncul di panel hasil. Jika Anda menjalankan banyak pernyataan, Anda mungkin melihat banyak paket ditampilkan di tab ini.
Dari sini Anda dapat memeriksa paket eksekusi di SQL Server Management Studio, atau klik kanan pada paket tersebut dan pilih "Simpan Paket Eksekusi Sebagai ..." untuk menyimpan paket ke file dalam format XML.
Metode 2 - Menggunakan opsi SHOWPLAN
Metode ini sangat mirip dengan metode 1 (sebenarnya inilah yang dilakukan SQL Server Management Studio secara internal), namun saya telah memasukkannya untuk kelengkapan atau jika Anda tidak memiliki SQL Server Management Studio yang tersedia.
Sebelum Anda menjalankan kueri, jalankan salah satu dari pernyataan berikut. Pernyataan harus merupakan satu-satunya pernyataan dalam kumpulan, yaitu Anda tidak dapat menjalankan pernyataan lain secara bersamaan:
Ini adalah opsi koneksi dan Anda hanya perlu menjalankan ini sekali per koneksi. Dari titik ini pada semua pernyataan dijalankan akan disertai oleh resultset tambahan berisi rencana eksekusi Anda dalam format yang diinginkan - jalankan saja permintaan Anda seperti biasanya melihat paket.
Setelah selesai, Anda dapat mematikan opsi ini dengan pernyataan berikut:
Perbandingan format rencana eksekusi
Kecuali Anda memiliki preferensi yang kuat, rekomendasi saya adalah menggunakan
STATISTICS XML
opsi. Opsi ini setara dengan opsi "Sertakan Rencana Eksekusi Aktual" di SQL Server Management Studio dan memasok sebagian besar informasi dalam format yang paling nyaman.SHOWPLAN_TEXT
- Menampilkan perkiraan rencana eksekusi berdasarkan teks, tanpa menjalankan kueriSHOWPLAN_ALL
- Menampilkan estimasi rencana eksekusi berdasarkan teks dengan estimasi biaya, tanpa mengeksekusi kueriSHOWPLAN_XML
- Menampilkan rencana eksekusi estimasi berbasis XML dengan estimasi biaya, tanpa mengeksekusi query. Ini sama dengan opsi "Tampilkan Perkiraan Rencana Eksekusi ..." di SQL Server Management Studio.STATISTICS PROFILE
- Mengeksekusi kueri dan menampilkan rencana eksekusi aktual berbasis teks.STATISTICS XML
- Menjalankan query dan menampilkan rencana eksekusi aktual berbasis XML. Ini sama dengan opsi "Sertakan Rencana Eksekusi Aktual" di SQL Server Management Studio.Metode 3 - Menggunakan SQL Server Profiler
Jika Anda tidak dapat menjalankan kueri Anda secara langsung (atau kueri Anda tidak berjalan lambat ketika Anda menjalankannya secara langsung - ingat kami ingin rencana permintaan berkinerja buruk), maka Anda dapat menangkap rencana menggunakan jejak SQL Server Profiler. Idenya adalah menjalankan kueri Anda saat jejak yang menangkap salah satu acara "Showplan" sedang berjalan.
Perhatikan bahwa tergantung pada beban Anda dapat menggunakan metode ini pada lingkungan produksi, namun Anda harus berhati-hati. Mekanisme profil SQL Server dirancang untuk meminimalkan dampak pada database tetapi ini tidak berarti bahwa tidak akan ada dampak kinerja. Anda juga mungkin mengalami masalah dalam memfilter dan mengidentifikasi rencana yang benar dalam penelusuran Anda jika basis data Anda banyak digunakan. Anda jelas harus memeriksa dengan DBA Anda untuk melihat apakah mereka senang dengan Anda melakukan ini pada database berharga mereka!
Paket yang Anda dapatkan setara dengan opsi "Sertakan Rencana Eksekusi Aktual" di SQL Server Management Studio.
Metode 4 - Memeriksa cache kueri
Jika Anda tidak dapat menjalankan kueri Anda secara langsung dan Anda juga tidak dapat menangkap jejak profiler maka Anda masih dapat memperoleh rencana yang diperkirakan dengan memeriksa cache paket permintaan SQL.
Kami memeriksa cache paket dengan menanyakan SQL Server DMVs . Berikut ini adalah permintaan dasar yang akan mencantumkan semua paket permintaan yang di-cache (sebagai xml) bersama dengan teks SQL-nya. Pada sebagian besar basis data, Anda juga perlu menambahkan klausa pemfilteran tambahan untuk memfilter hasilnya ke hanya paket yang Anda minati.
Jalankan permintaan ini dan klik pada paket XML untuk membuka paket di jendela baru - klik kanan dan pilih "Simpan paket eksekusi sebagai ..." untuk menyimpan paket ke file dalam format XML.
Catatan:
Karena ada begitu banyak faktor yang terlibat (mulai dari tabel dan skema indeks hingga data yang disimpan dan statistik tabel) Anda harus selalu mencoba untuk mendapatkan rencana eksekusi dari database yang Anda minati (biasanya yang mengalami kinerja masalah).
Anda tidak dapat menangkap rencana eksekusi untuk prosedur tersimpan terenkripsi.
rencana eksekusi "aktual" vs "diperkirakan"
Sebuah sebenarnya rencana eksekusi adalah salah satu di mana SQL Server benar-benar berjalan query, sedangkan diperkirakan rencana eksekusi SQL Server bekerja di luar apa yang akan lakukan tanpa mengeksekusi query. Meskipun secara logika setara, rencana eksekusi aktual jauh lebih berguna karena berisi detail dan statistik tambahan tentang apa yang sebenarnya terjadi ketika menjalankan kueri. Ini penting ketika mendiagnosis masalah di mana estimasi SQL Server tidak aktif (seperti ketika statistik kedaluwarsa).
Bagaimana cara menginterpretasikan rencana eksekusi permintaan?
Ini adalah cukup layak topik untuk (gratis) buku dalam dirinya sendiri.
Lihat juga:
sumber
SET STATISTICS XML ON
semut awal kueri, danSET STATISTICS XML OFF|ON
area sekitarnya yang tidak ingin Anda tampilkan dalam output paket: Saya menemukan ini berguna ketika kueri berisi iterasi (WHILE) yang tidak Anda inginkan / butuhkan untuk melihat dalam rencana eksekusi (jika tidak akan terlalu berat dan panjang untuk SQL SERVER untuk menampilkannya).Selain jawaban komprehensif yang sudah diposting kadang-kadang berguna untuk dapat mengakses rencana eksekusi secara sistematis untuk mengekstrak informasi. Contoh kode untuk ini adalah di bawah ini.
Contoh
StartCapture
DefinisiContoh
StopCapture
Definisisumber
sumber
Selain metode yang dijelaskan dalam jawaban sebelumnya, Anda juga dapat menggunakan penampil paket eksekusi gratis dan alat optimisasi kueri ApexSQL Plan (yang baru saja saya bahas).
Anda dapat menginstal dan mengintegrasikan Rencana ApexSQL ke dalam SQL Server Management Studio, sehingga rencana eksekusi dapat dilihat dari SSMS secara langsung.
Melihat Perkiraan rencana eksekusi di Paket ApexSQL
Melihat paket eksekusi aktual dalam Paket ApexSQL
Untuk melihat rencana pelaksanaan Aktual permintaan, lanjutkan dari langkah ke-2 yang disebutkan sebelumnya, tetapi sekarang, setelah rencana Perkiraan ditampilkan, klik tombol "Aktual" dari bilah pita utama dalam Paket ApexSQL.
Setelah tombol "Aktual" diklik, rencana eksekusi Aktual akan ditampilkan dengan pratinjau terperinci dari parameter biaya bersama dengan data rencana eksekusi lainnya.
Informasi lebih lanjut tentang melihat rencana eksekusi dapat ditemukan dengan mengikuti tautan ini .
sumber
Alat favorit saya untuk mendapatkan dan menganalisis secara mendalam rencana pelaksanaan kueri adalah SQL Sentry Plan Explorer . Ini jauh lebih ramah pengguna, nyaman dan komprehensif untuk analisis detail dan visualisasi rencana eksekusi daripada SSMS.
Berikut ini contoh cuplikan layar bagi Anda untuk memiliki gagasan tentang fungsionalitas apa yang ditawarkan oleh alat ini:
Ini hanya salah satu tampilan yang tersedia di alat. Perhatikan serangkaian tab di bagian bawah jendela aplikasi, yang memungkinkan Anda mendapatkan berbagai jenis representasi rencana eksekusi dan juga informasi tambahan yang berguna.
Selain itu, saya belum melihat adanya batasan edisi gratis yang mencegah penggunaannya setiap hari atau memaksa Anda untuk membeli versi Pro pada akhirnya. Jadi, jika Anda lebih suka menggunakan edisi gratis, tidak ada yang melarang Anda melakukannya.
UPDATE: (Terima kasih kepada Martin Smith ) Plan Explorer sekarang gratis! Lihat http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view untuk detailnya.
sumber
Speaking of third-party tools
ketika tidak ada yang menyebutkan alat pihak ketiga.Paket kueri dapat diperoleh dari sesi Acara yang diperluas melalui
query_post_execution_showplan
acara tersebut. Inilah contoh sesi XEvent:Setelah Anda membuat sesi, (dalam SSMS) pergi ke Object Explorer dan mempelajari Manajemen | Acara yang Diperpanjang | Sesi. Klik kanan sesi "GetExecutionPlan" dan mulai saja. Klik kanan lagi dan pilih "Tonton Data Langsung".
Selanjutnya, buka jendela permintaan baru dan jalankan satu atau lebih permintaan. Inilah satu untuk AdventureWorks:
Setelah beberapa saat, Anda akan melihat beberapa hasil di tab "GetExecutionPlan: Live Data". Klik salah satu peristiwa query_post_execution_showplan di kisi, dan kemudian klik tab "Rencana Kueri" di bawah kisi. Seharusnya terlihat seperti ini:
EDIT : Kode XEvent dan tangkapan layar dihasilkan dari SQL / SSMS 2012 w / SP2. Jika Anda menggunakan SQL 2008 / R2, Anda mungkin dapat mengubah skrip untuk membuatnya berjalan. Tetapi versi itu tidak memiliki GUI, jadi Anda harus mengekstrak XML showplan, menyimpannya sebagai file * .sqlplan dan membukanya di SSMS. Itu merepotkan. XEvents tidak ada di SQL 2005 atau sebelumnya. Jadi, jika Anda tidak menggunakan SQL 2012 atau lebih baru, saya akan sangat menyarankan salah satu jawaban lain yang diposting di sini.
sumber
Mulai dari SQL Server 2016+, fitur Query Store diperkenalkan untuk memantau kinerja. Ini memberikan wawasan tentang pilihan dan kinerja rencana kueri. Ini bukan pengganti lengkap jejak atau peristiwa yang diperpanjang, tetapi karena ini berkembang dari versi ke versi, kita mungkin mendapatkan toko permintaan berfungsi penuh di rilis mendatang dari SQL Server. Aliran utama dari Query Store
Mengaktifkan Query Store : Query Store bekerja di level database di server.
tempdb
database.Kumpulkan Informasi di Query Store : Kami mengumpulkan semua informasi yang tersedia dari tiga toko menggunakan Query Store DMV (Tampilan Manajemen Data).
Query Plan Store: Menahan informasi rencana eksekusi dan bertanggung jawab untuk menangkap semua informasi yang terkait dengan kompilasi permintaan.
Toko Statistik Runtime: Tetap menggunakan informasi statistik eksekusi dan mungkin merupakan toko yang paling sering diperbarui. Statistik ini mewakili data eksekusi permintaan.
Stats Wait Query Store: Bertahan dan menangkap informasi statistik tunggu.
CATATAN: Query Wait Stats Store hanya tersedia di SQL Server 2017+
sumber
Seperti dengan SQL Server Management Studio (sudah dijelaskan), dimungkinkan juga dengan Datagrip seperti yang dijelaskan di sini .
sumber
Inilah satu hal penting yang perlu diketahui selain semua yang dikatakan sebelumnya.
Paket kueri seringkali terlalu rumit untuk diwakili oleh tipe kolom XML bawaan yang memiliki batasan 127 level elemen bersarang. Itulah salah satu alasan mengapa sys.dm_exec_query_plan dapat mengembalikan
NULL
atau bahkan melemparkan kesalahan dalam versi MS SQL sebelumnya, jadi umumnya lebih aman menggunakan sys.dm_exec_text_query_plan sebagai gantinya. Yang terakhir ini juga memiliki fitur bonus yang berguna untuk memilih rencana untuk pernyataan tertentu daripada keseluruhan kumpulan. Berikut cara Anda menggunakannya untuk melihat paket pernyataan yang sedang berjalan:Namun kolom teks dalam tabel yang dihasilkan tidak terlalu berguna dibandingkan dengan kolom XML. Untuk dapat mengklik hasil yang akan dibuka di tab terpisah sebagai diagram, tanpa harus menyimpan kontennya ke file, Anda dapat menggunakan sedikit trik (ingat Anda tidak bisa hanya menggunakan
CAST(... AS XML)
), meskipun ini hanya akan bekerja untuk satu baris:sumber
Anda juga dapat melakukannya melalui PowerShell menggunakan SET STATISTICS XML ON untuk mendapatkan rencana yang sebenarnya. Saya telah menulisnya sehingga menggabungkan rencana multi-pernyataan menjadi satu rencana;
sumber
Perkiraan rencana eksekusi
Perkiraan rencana eksekusi dihasilkan oleh Pengoptimal tanpa menjalankan kueri SQL.
Untuk mendapatkan perkiraan rencana eksekusi, Anda harus mengaktifkan
SHOWPLAN_ALL
pengaturan sebelum mengeksekusi kueri.SET SHOWPLAN_ALL ON
Sekarang, ketika menjalankan query SQL berikut:
SQL Server akan menghasilkan estimasi rencana eksekusi berikut:
Setelah menjalankan kueri, kami tertarik untuk mendapatkan rencana eksekusi yang diperkirakan, Anda harus menonaktifkannya
SHOWPLAN_ALL
karena, jika tidak, sesi database saat ini hanya akan menghasilkan estimasi rencana eksekusi alih-alih mengeksekusi query SQL yang disediakan.Perkiraan paket SQL Server Management Studio
Dalam aplikasi SQL Server Management Studio, Anda dapat dengan mudah mendapatkan estimasi rencana eksekusi untuk setiap permintaan SQL dengan menekan
CTRL+L
pintasan kunci.Rencana eksekusi aktual
Paket eksekusi SQL aktual dihasilkan oleh Pengoptimal saat menjalankan kueri SQL. Jika statistik tabel database akurat, rencana aktual seharusnya tidak berbeda secara signifikan dari yang diperkirakan.
Untuk mendapatkan rencana eksekusi aktual pada SQL Server, Anda harus mengaktifkan
STATISTICS IO, TIME, PROFILE
pengaturan, seperti yang diilustrasikan oleh perintah SQL berikut:Sekarang, ketika menjalankan kueri sebelumnya, SQL Server akan menghasilkan rencana eksekusi berikut:
Setelah menjalankan kueri, kami tertarik untuk mendapatkan paket eksekusi yang sebenarnya, Anda perlu menonaktifkan
STATISTICS IO, TIME, PROFILE ON
pengaturan seperti ini:Rencana aktual SQL Server Management Studio
Dalam aplikasi SQL Server Management Studio, Anda dapat dengan mudah mendapatkan estimasi rencana eksekusi untuk setiap permintaan SQL dengan menekan
CTRL+M
pintasan kunci.sumber
Menjelaskan rencana eksekusi bisa sangat rinci dan memakan waktu yang cukup lama, tetapi dalam ringkasan jika Anda menggunakan 'jelaskan' sebelum permintaan, itu akan memberi Anda banyak info termasuk bagian mana yang dieksekusi terlebih dahulu. jika Anda ingin membaca sedikit lebih detail tentang ini, saya menyusun sebuah blog kecil tentang ini yang mengarahkan Anda juga ke referensi yang tepat. https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470
sumber