Parameter mengendus bekerja di sekitarnya

8

Saya telah menggunakan dua metode untuk mengatasi masalah mengendus parameter di masa lalu:

1) Gunakan WITH RECOMPILE
2) Tetapkan kembali nilai parameter ke variabel lokal dan gunakan itu bukan parameter

Dari apa yang saya mengerti, hasil akhir dari keduanya adalah sama - rencana eksekusi baru yang dioptimalkan untuk permintaan / params saat ini dibuat dan digunakan.

Jika ini benar, apakah ada perbedaan antara kedua metode ini atau apakah keduanya pada dasarnya sama? Apakah yang satu lebih disukai daripada yang lain?

Abe Miessler
sumber

Jawaban:

3

Jika Anda dapat mengantisipasi nilai-nilai tipikal, jalankan prosedur tersimpan Anda dengan nilai-nilai tersebut setiap kali Anda (kembali) membuatnya. Rencana eksekusi akan dibuat berdasarkan nilai-nilai ini, dan disimpan untuk digunakan di masa mendatang. Sebagian besar .sqlfile prosedur tersimpan saya diakhiri dengan EXECperintah dengan nilai-nilai yang wajar, untuk tujuan yang tepat ini (itu, dan untuk mengidentifikasi kesalahan dasar dalam kode).

Tentu saja ini tidak akan membantu jika prosedur tersimpan Anda berjalan sangat lama, cukup sehingga Anda tidak dapat menjalankannya secara wajar selama jam produksi. Perhatikan bahwa itu tidak cukup untuk memulai pekerjaan, itu harus diselesaikan dengan sukses agar rencana disimpan.

Jon dari Semua Perdagangan
sumber
4
  1. WITH RECOMPILE

Ini sedikit godam. Itu mengkompilasi ulang setiap pernyataan dalam modul. Menggunakan OPTION (RECOMPILE)pada pernyataan yang peka terhadap parameter adalah solusi yang lebih bertarget.

  1. Tetapkan ulang nilai parameter ke variabel lokal dan gunakan itu sebagai ganti parameter

Ini memiliki efek yang sama OPTIMIZE FOR UNKNOWNdengan rencana dibuat berdasarkan nilai rata-rata. Paket tidak mengkompilasi ulang pada setiap eksekusi.

Untuk informasi lebih lanjut, lihat artikel saya Parameter Sniffing, Embedding, dan Opsi RECOMPILE .

Paul White 9
sumber