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

Peningkatan Showplan untuk UDF

Microsoft telah meningkatkan konten keluaran ShowplanXML untuk SQL Server selama beberapa rilis terakhir dan di SQL Server 2017 CU3, mereka memperkenalkan statistik eksekusi fungsi yang ditentukan pengguna (UDF) ke dalam simpul QueryTimeStats dari keluaran XML. Ini juga di-porting kembali ke SQL Server 2016 di Paket Layanan 2 untuk rencana eksekusi yang sebenarnya. Fitur ini memungkinkan Anda mengetahui secara pasti dampak eksekusi UDF skalar sebagai bagian dari karakteristik kinerja kueri. Namun, ada hal menarik yang terkait dengan penggunaan fitur ini; Anda harus mengumpulkan rencana eksekusi yang sebenarnya menggunakan versi terbaru dari SQL Server Management Studio atau menggunakan SentryOne Plan Explorer, atau informasi tersebut akan dihapus dari rencana eksekusi.

Membandingkan Paket dalam Versi SSMS yang Berbeda

Saya baru-baru ini mempresentasikan sesi grup pengguna di Chicago tentang penyetelan kinerja kueri menggunakan cache paket dan selama sesi tersebut saya menggunakan rilis terbaru SQL Server Management Studio pada waktu itu, versi 17.5. Pada saat itu saya juga baru saja memperbarui VM saya ke SQL Server 2016 Service Pack 2, jadi saya mendemonstrasikan informasi UdfElapsedTime dan UdfCpuTime baru di showplan QueryTimeStats yang sebenarnya dan membuat catatan untuk diri saya sendiri untuk menulis artikel tentang thm. Ketika saya kembali untuk benar-benar memulai artikel ini, menggunakan kueri yang sama persis pada VM yang sama persis, saya tidak dapat membuat rencana eksekusi aktual yang berisi informasi UdfElapsedTime atau UdfCpuTime meskipun telah dicoba berulang kali. Saya tidak tahu apa yang saya lakukan salah, dan ternyata akar masalahnya adalah saya secara tidak sengaja meluncurkan SQL Server Management Studio 2016 alih-alih SQL Server Management Studio 17.5. Ketika saya menjalankan kueri yang sama di SSMS 17.5, saya tiba-tiba mendapatkan kembali informasi UdfElapsedTime dan UdfCpuTime. Lihat di bawah untuk contoh XML yang dikembalikan dari kedua versi SSMS:

Tampilkan XML dari SSMS 17,5

Tampilkan XML dari SSMS 2016 – WaitStats dan QueryTimeStats telah sepenuhnya dihapus

Saya menggunakan Penganalisis Pesan Microsoft untuk menghasilkan jejak TCP lalu lintas jaringan pada port 1433 antara klien yang menjalankan SSMS 2016 terhadap contoh SQL Server 2016 SP2 untuk menangkap paket TDS yang dikirim dari server ke klien. Ini mengungkapkan bahwa ShowPlanXML yang dikembalikan oleh server menyertakan informasi QueryTimeStats meskipun tidak muncul di ShowPlanXML di SSMS 2016, jadi klien sebenarnya menghapus bidang apa pun yang tidak termasuk dalam definisi skema yang dikirimkan bersama klien.

Offset Pesan:1635
<.Q.u.e.r.y.T.i.m.e.S.t.a.t.s. .E.l.a.p.s.e.d.T.i.m.e.=.".2.6.7.". .C.p.u.T.i.m.e.=.".2.6.7.". .U.d.f.E.l.a.p.s.e.d.T.i.m.e.=.".2.1.5.". .U.d.f.C.p.u.T.i.m.e.=.".2.1.5.".>.<./.Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>

Ini adalah sesuatu yang harus diwaspadai dengan file .sqlplan yang dihasilkan menggunakan versi klien yang lebih lama dari SSMS dan/atau rencana eksekusi yang disimpan atau disalin dari versi SSMS yang lebih lama, yang sering terjadi ketika saya bekerja dengan klien oleh surel.

Di SSMS, melihat rencana eksekusi grafis tidak memberi Anda indikasi dampak kinerja dari eksekusi fungsi skalar yang ditentukan pengguna dalam kueri:

Jika kami mendasarkan analisis kinerja kami secara ketat pada biaya masing-masing operator, Skalar Hitung untuk eksekusi fungsi tidak terlihat seperti dampak yang signifikan terhadap kinerja. Tip alat untuk operator juga tidak mewujudkan informasi atau berisi peringatan apa pun tentang dampak fungsi yang ditentukan pengguna. Satu-satunya tempat kami melihat bahwa informasi dalam SSMS saat ini adalah dalam XML paket, atau di Jendela Properti untuk operator root SELECT dari paket, seperti yang ditunjukkan di bawah ini:

Dengan menggunakan informasi di sini, kita dapat melihat bahwa UdfCpuTime adalah 85,79% dari total CpuTime dan UdfElapsedTime adalah 64,44% dari total ElapsedTime untuk eksekusi kueri (melakukan matematika untuk menghitung persentase menggunakan QueryTimeStats CpuTime dan UdfCpuTime (disorot di biru di atas), dan ElapsedTime dan UdfElapsedTime).

Menggunakan SentryOne Plan Explorer untuk Mengambil Paket

Salah satu alat gratis favorit saya untuk membantu penyetelan kinerja SQL Server adalah SentryOne Plan Explorer, dan salah satu fitur Plan Explorer untuk waktu yang lama adalah kemampuan untuk menghasilkan rencana eksekusi aktual dengan menempelkan teks perintah ke jendela baru dan mengklik tombol Dapatkan Paket Aktual, seperti yang ditunjukkan di bawah ini.

Karena Plan Explorer membaca ShowplanXML seperti yang disediakan oleh mesin SQL Server, itu juga akan berisi informasi yang disempurnakan di QueryTimeStats. Namun, jika Anda membuka rencana eksekusi yang disimpan dari versi yang lebih lama dari Management Studio, atau jika Anda menggunakan Addin Plan Explorer untuk SSMS di versi yang lebih lama untuk melihat rencana di Plan Explorer, maka informasi yang disempurnakan tidak akan ditampilkan.

Kisi Pernyataan dari tab Hasil di Plan Explorer dapat diperbarui menggunakan Pemilih Kolom untuk menambahkan kolom Durasi UDF dan CPU UDF bersama dengan kolom yang ada di kisi, sehingga memudahkan untuk melihat di mana eksekusi fungsi yang ditentukan pengguna berdampak untuk batch multi-pernyataan yang besar. Plan Explorer juga memberikan penyorotan kolom-kolom ini jika kolom tersebut merupakan bagian yang signifikan dari keseluruhan CPU dan/atau durasi seperti yang ditunjukkan di bawah ini.

Informasi diagram rencana di Plan Explorer juga telah ditingkatkan. Berikut adalah diagram menggunakan Biaya oleh CPU + I/O dan kemudian Biaya oleh CPU:

Rencanakan diagram menggunakan Biaya oleh CPU + I/O

Rencanakan diagram menggunakan Biaya oleh CPU

Ada peringatan tambahan pada operator root SELECT ketika statistik eksekusi untuk fungsi yang ditentukan pengguna menunjukkan bahwa itu adalah bagian yang signifikan dari keseluruhan CPU dan/atau durasi keseluruhan:

Keterangan alat untuk root PILIH operator

Operator Compute Scalar juga memiliki peringatan di Plan Explorer berdasarkan jumlah baris yang sedang diproses oleh operasi, bahkan untuk paket yang tidak menyertakan penyempurnaan untuk ShowplanXML:

Keterangan alat untuk Perhitungan Operator skalar

Menampilkan biaya oleh CPU dapat membantu mengidentifikasi operator dengan biaya CPU tersembunyi yang mungkin ditenggelamkan oleh I/O. Kemampuan untuk sedikit menggeser tampilan untuk memecahkan masalah baik CPU atau I/O sendiri adalah salah satu dari banyak pembeda antara Plan Explorer dan SSMS. Berikut adalah menu konteks diagram tempat Anda dapat mengubah tampilan ini:

Kesimpulan

Penyempurnaan pada Showplan XML di SQL Server membuatnya lebih mudah untuk menentukan dampak keseluruhan dari fungsi skalar yang ditentukan pengguna pada kinerja kueri di SQL Server 2016 Paket Layanan 2 dan SQL Server 2017 Pemutakhiran Kumulatif 3, selama Anda menggunakan lebih banyak versi terbaru alat klien atau Plan Explorer untuk mengambil rencana eksekusi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengantar Concurrent Collection API di Java

  2. Dapatkan dinyalakan oleh Apache Spark – Bagian 2

  3. Cara Bekerja Dengan Warisan di Entity Framework Core

  4. Opsi Penyesuaian Kinerja Database Azure SQL

  5. Pemodelan Basis Data