Apakah ada cara APA PUN untuk membuat hasilnya dengan tepat 3 panduan berbeda dan tidak lebih? Saya berharap dapat menjawab pertanyaan dengan lebih baik di masa depan dengan memasukkan panduan paket dengan kueri tipe CTE yang direferensikan beberapa kali untuk mengatasi beberapa quirks CTE SQL Server.
Tidak hari ini. Ekspresi tabel umum non-rekursif (CTE) diperlakukan sebagai definisi tampilan in-line dan diperluas ke pohon kueri logis di setiap tempat yang direferensikan (seperti definisi tampilan biasa) sebelum optimasi. Pohon logis untuk permintaan Anda adalah:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Perhatikan dua View Anchors dan enam panggilan ke fungsi intrinsik newid
sebelum optimasi dimulai. Namun demikian, banyak orang menganggap bahwa pengoptimal harus dapat mengidentifikasi bahwa sub-pohon diperluas pada awalnya merupakan objek referensi tunggal dan menyederhanakannya. Ada juga beberapa permintaan Connect untuk memungkinkan terwujudnya CTE atau tabel turunan secara eksplisit.
Implementasi yang lebih umum akan membuat optimizer mempertimbangkan untuk mewujudkan ekspresi umum yang sewenang-wenang untuk meningkatkan kinerja ( CASE
dengan subquery adalah contoh lain di mana masalah dapat terjadi hari ini). Microsoft Research menerbitkan sebuah makalah (PDF) pada tahun 2007 itu, meskipun masih belum diimplementasikan hingga saat ini. Untuk saat ini, kami terbatas pada materialisasi eksplisit menggunakan hal-hal seperti variabel tabel dan tabel sementara.
SQLKiwi telah menyebutkan menyusun rencana dalam SSIS, apakah ada cara atau alat yang berguna untuk membantu dalam menyusun rencana yang baik untuk SQL Server?
Ini hanya angan - angan di pihak saya, dan melampaui gagasan memodifikasi panduan rencana. Mungkin, pada prinsipnya, untuk menulis alat untuk memanipulasi XML rencana acara secara langsung, tetapi tanpa instrumentasi pengoptimal tertentu menggunakan alat tersebut kemungkinan akan menjadi pengalaman yang membuat frustasi bagi pengguna (dan pengembang memikirkannya).
Dalam konteks khusus dari pertanyaan ini, alat seperti itu masih tidak dapat mematerialisasikan isi CTE dengan cara yang dapat digunakan oleh banyak konsumen (untuk memberi makan kedua input ke pasangan silang dalam kasus ini). Pengoptimal dan mesin eksekusi mendukung gulungan multi-konsumen, tetapi hanya untuk tujuan tertentu - tidak ada yang dapat dibuat untuk diterapkan pada contoh khusus ini.
Meskipun saya tidak yakin, saya memiliki firasat yang cukup kuat bahwa RelOps dapat diikuti (Nested Loop, Lazy Spool) bahkan jika kueri tidak persis sama dengan paket - misalnya jika Anda menambahkan 4 dan 5 ke CTE , masih terus menggunakan paket yang sama (tampaknya - diuji pada SQL Server 2012 RTM Express).
Ada cukup banyak fleksibilitas di sini. Bentuk luas dari rencana XML digunakan untuk memandu pencarian rencana akhir (meskipun banyak atribut diabaikan sepenuhnya misalnya tipe partisi pada pertukaran) dan aturan pencarian normal juga sangat santai. Sebagai contoh, pemangkasan awal alternatif berdasarkan pertimbangan biaya dinonaktifkan, pengenalan silang secara eksplisit diperbolehkan, dan operasi skalar diabaikan.
Ada terlalu banyak detail untuk dibahas secara mendalam, tetapi penempatan Filter dan Komputasi Skalar tidak dapat dipaksakan, dan predikat formulir column = value
digeneralisasi sehingga rencana yang berisi X = 1
atau X = @X
dapat diterapkan ke kueri yang berisi X = 502
atau X = @Y
. Fleksibilitas khusus ini dapat sangat membantu dalam menemukan rencana alami untuk dipaksakan.
Dalam contoh spesifik, konstanta All Union dapat selalu diimplementasikan sebagai Scan Constant; jumlah input ke Union All tidak masalah.