Apakah ada cara untuk mencegah pemangkasan memo struktur?

8

Kita tahu bahwa struktur memo dipangkas dan beberapa rencana alternatif yang mahal dibuang selama optimasi. Saya bertanya-tanya apakah ada cara untuk mencegah hal ini dan membiarkan pengoptimal hanya mempertimbangkan setiap rencana yang mungkin dan memilih yang terbaik dari semua alternatif?

zli89
sumber
3
Tidak jelas apa yang ingin Anda cegah. Apakah Anda ingin memaksa pengoptimal untuk menghitung biaya untuk semua paket yang mungkin (yang bisa mencapai triliunan zilyun, bahkan untuk kueri sederhana dengan 10 bergabung)?
ypercubeᵀᴹ
ya, meskipun sepertinya tidak mungkin. Saya ingin memaksa pengoptimal untuk mempertimbangkan semua rencana yang mungkin, menghitung biayanya, dan kemudian memilih yang termurah.
zli89
4
Dan mengapa itu harus dilakukan? Jika telah dihitung katakanlah sebuah rencana dengan biaya = 7, dan kemudian menemukan bahwa setiap rencana yang termasuk a hash join bakan menelan biaya 10 atau lebih, mengapa menghitung semua juta rencana itu dan tidak memangkasnya? (bukan berarti pengoptimal bekerja dengan cara yang sangat sederhana)
ypercubeᵀᴹ

Jawaban:

12

Kita tahu bahwa struktur memo dipangkas dan beberapa rencana alternatif yang mahal dibuang selama optimasi. Saya bertanya-tanya apakah ada cara untuk mencegah hal ini dan membiarkan pengoptimal hanya mempertimbangkan setiap rencana yang mungkin dan memilih yang terbaik dari semua alternatif?

Memang ada, tapi saya tidak mempublikasikannya karena itu akan disalahpahami dan disalahgunakan. Dalam kasus apa pun, ini tidak akan menghasilkan pencarian menyeluruh dari ruang rencana karena hanya serangkaian transformasi terbatas (yang biasanya menghasilkan hasil yang baik) yang diimplementasikan.

Mencegah pemangkasan dan pembuangan umumnya hanya akan menghasilkan waktu kompilasi lebih lama tanpa banyak peningkatan kualitas rencana akhir, jika ada.

Pada akhirnya, pertanyaan itu wajar dan masuk akal, tetapi didasarkan pada kesalahpahaman tujuan pengoptimal permintaan SQL Server: ia dirancang untuk menemukan rencana yang baik untuk pertanyaan umum dengan cepat. Itu tidak dibangun di atas kerangka kerja yang dirancang untuk pencarian lengkap.

Jika Anda memiliki situasi dunia nyata yang akan mendapat manfaat dari pendekatan yang berbeda untuk optimasi, Anda dapat membuat kasus untuk itu di situs web Connect (meskipun saya pikir itu tidak mungkin Microsoft akan menginvestasikan sumber daya teknik yang diperlukan).

Paul White 9
sumber
9

Tidak ada tombol atau tanda jejak yang saya tahu memaksa perilaku ini dengan cara apa pun (meskipun Paul White menyebutkan beberapa tanda jejak di sini yang memberikan lebih banyak visibilitas dan memungkinkan Anda untuk membujuk beberapa delta perilaku ).

Microsoft menyediakan banyak senjata, tetapi yang ini hampir dijamin dijamin tepat di kaki Anda 100%. Ketika menjalankan kueri untuk pertama kalinya, saya tidak berpikir Anda ingin SQL Server menghabiskan waktu tak terbatas untuk membangun setiap variasi yang mungkin dari suatu rencana untuk mendapatkan hasil yang diinginkan. Sebagai @ypercube menyebutkan, ini bisa menjadi sangat banyak rencana, dan akan jenis kekalahan tujuan menjalankan query sama sekali. Tujuan Anda dalam menjalankan kueri di tempat pertama, mungkin, adalah untuk mengembalikan data di beberapa titik, kan? Dan "beberapa titik" harus berada dalam ambang tertentu, karena lapisan tertentu aplikasi Anda akan memiliki berbagai batas waktu kueri / perintah, dan pengguna hanya akan menunggu begitu lama untuk memuat halaman ...

Aaron Bertrand
sumber