Pengoptimalan: Memindahkan deklarasi variabel ke atas prosedur Anda

15

Ketika bekerja untuk mengoptimalkan beberapa prosedur tersimpan, saya duduk dengan DBA dan menjalani beberapa prosedur tersimpan dengan pemblokiran tinggi dan / atau aktivitas baca / tulis tinggi.

Satu hal yang disebutkan DBA adalah saya harus mendeklarasikan semua variabel (terutama TABLEyang) di bagian atas prosedur tersimpan untuk menghindari kompilasi ulang.

Ini adalah yang pertama saya dengar dan sedang mencari konfirmasi sebelum meninjau kembali semua prosedur tersimpan yang kita miliki. Dia menyebutnya "keterlambatan melihat kode", dan kompilasi ulang mengunci skema yang akan menjelaskan pemblokiran.

Apakah memindahkan semua deklarasi variabel ke atas prosedur tersimpan Anda mengurangi kompilasi ulang?

brad.v
sumber

Jawaban:

18

Tidak.

Ini dulu benar sejak lama (dan tidak lagi, setidaknya sejak SQL Server 2000), atau itu tidak pernah benar dan DBA Anda hanya mengacaukan rekomendasinya dengan yang berikut :

Penting untuk mengelompokkan semua pernyataan DDL (seperti membuat indeks) untuk tabel sementara pada awal prosedur tersimpan. Dengan menempatkan pernyataan DDL ini bersama-sama kompilasi yang tidak perlu karena perubahan skema dapat dihindari.

Anda dapat menemukan penjelasan lain tentang alasan di balik rekomendasi ini di halaman ini .

Jika kita melihat pada Microsoft KB ini , kita melihat bahwa penyebab kompilasi ulang prosedur tersimpan dapat menjadi salah satu dari yang berikut ini (SQL Server 2005+):

  1. Skema berubah.
  2. Statistik berubah.
  3. Kompilasi ulang DNR.
  4. Setel opsi berubah.
  5. Tabel temp berubah.
  6. Rowset jarak jauh berubah.
  7. Untuk menelusuri perms berubah.
  8. Lingkungan pemberitahuan kueri berubah.
  9. Tampilan MPI berubah.
  10. Opsi kursor berubah.
  11. Dengan opsi kompilasi ulang.

Mendeklarasikan variabel - bahkan variabel tabel (mis. @table_variable) - tidak dapat memicu semua peristiwa ini, jelas, karena mendeklarasikan variabel tidak dihitung sebagai DDL . Variabel (bahkan variabel tabel) adalah objek sementara yang digunakan secara eksklusif untuk pemrograman T-SQL Anda. Itu sebabnya variabel tabel tidak mendapatkan statistik dan tidak terikat oleh transaksi . Mendeklarasikan variabel (tabel atau tidak) tidak dapat memicu kompilasi ulang proc.

Membuat tabel temp (yaitu #temp_table) atau indeks, bagaimanapun, adalah DDL yang mempengaruhi definisi fisik dari database. Temp tabel dan indeks adalah objek "nyata" dengan statistik dan kontrol transaksional, oleh karena itu membuat mereka dapat memecat salah satu peristiwa 1, 2, atau 5 dalam daftar di atas dan dengan demikian memicu kompilasi ulang proc.

Nick Chammas
sumber
3

Seharusnya tidak membuat perbedaan atau mengurangi kompilasi kunci atau menyebabkan kompilasi kurang untuk mendeklarasikan variabel setengah jalan tumpukan atau di atas. Saya kebetulan melakukan ini di bagian atas agar lebih mudah dibaca daripada tidak.

Untuk mendapatkan bagian "apa yang dipikirkan oleh DBA saya", satu-satunya hal yang dapat saya kemukakan (selain poin Nick bahwa mereka memikirkan bagaimana sesuatu yang dulu) mungkin adalah mereka berbicara tentang Parameter Sniffing (Lihat Opsi 2 di tautan ini pada pembicaraan sederhana)

Tentang pemblokiran Anda -> Jika Anda melihat pemblokiran sejati, itu bukan jenis kompilasi kunci pertentangan yang paling mungkin dibicarakan oleh DBA Anda. Meskipun benar bahwa ada hal-hal tertentu yang memengaruhi ini (bukan tabel kualifikasi skema, bukan skema yang memenuhi kualifikasi panggilan prosedur tersimpan Anda, misalnya) ini bukan penyebab pembacaan tinggi Anda tentu saja dan kemungkinan bukan penyebab pemblokiran Anda. Anda pasti harus melakukan semua yang Anda bisa untuk menghindari kunci kompilasi ini. Tapi saya akan melihat penyetelan dan mengoptimalkan sisa kode prosedur yang tersimpan sebagai tugas yang lebih penting daripada mengkhawatirkan di mana variabel berada. Anda juga dapat membaca Cara mengidentifikasi dan menyelesaikan kunci kompilasi jika Anda ingin memverifikasi bahwa Anda tidak mengalami masalah di sini.

Posting contoh sebelum / sesudah dan kita akan lihat apa yang dikendarai DBA di sini.

Mike Walsh
sumber