Dari pengetahuan saya yang terbatas tentang bagaimana rencana kueri dikompilasi, disimpan, dan diambil oleh kueri, saya mengerti bahwa kueri multi pernyataan atau prosedur tersimpan akan menghasilkan rencana kueri yang akan disimpan dalam cache kueri rencana untuk digunakan oleh kueri dalam eksekusi yang akan datang.
Saya pikir rencana ini diambil dari cache rencana kueri dengan hash kueri, yang berarti jika kueri diedit dan dieksekusi hash berbeda dan rencana baru dihasilkan karena hash yang cocok tidak dapat ditemukan dalam cache rencana kueri.
Pertanyaan saya adalah: Jika pengguna menjalankan pernyataan yang merupakan salah satu pernyataan dalam kueri multi-pernyataan, dapatkah ia menggunakan bagian yang relevan dari paket kueri yang sudah ada dalam cache untuk kueri multi-pernyataan? Saya berharap jawabannya tidak karena nilai hash jelas tidak akan cocok, tetapi apakah akan lebih baik untuk hash setiap pernyataan dalam kueri multi-pernyataan sehingga mereka dapat digunakan oleh pengguna yang menjalankan pernyataan individual dari kueri?
Saya berharap ada komplikasi yang tidak saya perhitungkan (Dan inilah yang benar-benar ingin saya ketahui) tetapi sepertinya kita bisa menyimpan 'rencana pernyataan' yang sama dalam banyak rencana kueri mengambil lebih banyak ruang dan mengambil lebih banyak CPU dan waktu untuk menghasilkan.
Bisa saja menunjukkan ketidaktahuan saya.
sumber
dbid
danobjectid
keduanya memilikiis_cache_key=1
sehingga Anda tidak akan mendapatkan penggunaan kembali rencana antara berbagai objek yang dikompilasi.Jawaban:
Tidak. Unit dasar rencana penggunaan kembali dalam SQL Server adalah batch .
Sistem yang disetel untuk penggunaan kembali paket tingkat tinggi akan menempatkan kode umum (pada granularity yang sesuai) dalam objek yang dapat digunakan kembali (mis. Prosedur, fungsi, pemicu) pada SQL Server. Ini juga akan secara eksplisit parameter setiap aplikasi yang dihasilkan atau kode sisi klien. Untuk penggunaan ulang paket maksimum, kumpulan yang dihasilkan ini harus berbeda hanya dalam nilai parameter.
Kedengarannya seperti Anda bertanya mengapa SQL Server dirancang untuk menyimpan dan menggunakan kembali pada tingkat batch, bukan pada tingkat pernyataan. Saya ragu siapa pun selain dari desainer asli dapat menjawab pertanyaan ini secara otoritatif. Bagaimanapun, menurut saya suatu batch adalah granularity alami untuk digunakan karena itu adalah unit kerja yang relatif mandiri, dan mewakili trade-off yang masuk akal antara kompleksitas implementasi dan kemungkinan rencana penggunaan kembali.
Ada beberapa hal yang membuat batch tidak sepenuhnya mandiri (misalnya tabel sementara lokal dibuat dan direferensikan melintasi batas prosedur tersimpan). Pengecualian ini mengurangi ortogonalitas dan telah dikaitkan dengan perilaku dan bug 'desain yang tak terduga' selama bertahun-tahun.
sumber