Apakah akan lebih baik untuk rencana kueri untuk dibagi dengan pernyataan untuk digunakan kembali?

11

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.

James Anderson
sumber
dbiddan objectidkeduanya memiliki is_cache_key=1sehingga Anda tidak akan mendapatkan penggunaan kembali rencana antara berbagai objek yang dikompilasi.
Martin Smith

Jawaban:

11

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?

Tidak. Unit dasar rencana penggunaan kembali dalam SQL Server adalah batch .

Akankah lebih baik untuk hash setiap pernyataan dalam kueri multi-pernyataan sehingga mereka dapat digunakan oleh pengguna yang menjalankan laporan individual dari kueri?

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.

Saya berharap ada komplikasi yang tidak saya perhitungkan

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.

Paul White 9
sumber