Saya biasanya membuat panduan rencana dengan terlebih dahulu membangun kueri yang menggunakan rencana yang benar, dan menyalinnya ke kueri serupa yang tidak. Namun, itu kadang rumit, terutama jika kuerinya tidak persis sama. Apa cara yang benar untuk membuat panduan rencana dari awal?
SQLKiwi telah menyebutkan menyusun rencana dalam SSIS, apakah ada cara atau alat yang berguna untuk membantu dalam menyusun rencana yang baik untuk SQL Server?
Contoh spesifik yang dimaksud adalah CTE: SQLFiddle ini
with cte(guid,other) as (
select newid(),1 union all
select newid(),2 union all
select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other;
Apakah ada cara APA SAJA untuk membuat hasil dengan tepat 3 berbeda guid
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.
sumber
Jawaban:
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:
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.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.
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 berisiX = 1
atauX = @X
dapat diterapkan ke kueri yang berisiX = 502
atauX = @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.
sumber
Tidak ada cara (versi SQL Server hingga 2012) untuk menggunakan kembali gulungan tunggal untuk kedua kejadian CTE. Detail dapat ditemukan dalam jawaban SQLKiwi. Lebih lanjut di bawah ini adalah dua cara untuk mewujudkan CTE dua kali, yang tidak dapat dihindari untuk sifat permintaan. Kedua opsi menghasilkan hitungan panduan jelas 6.
Tautan dari komentar Martin ke situs Quassnoi di sebuah blog tentang rencana memandu CTE adalah inspirasi parsial untuk pertanyaan ini. Ini menjelaskan cara untuk mewujudkan CTE untuk tujuan subquery berkorelasi, yang dirujuk hanya sekali meskipun korelasi dapat menyebabkannya dievaluasi beberapa kali. Itu tidak berlaku untuk kueri dalam pertanyaan.
Opsi 1 - Panduan Perencanaan
Mengambil petunjuk dari jawaban SQLKiwi, saya telah mengurangi panduan ke minimum yang masih akan melakukan pekerjaan, misalnya
ConstantScan
node hanya daftar 2 operator skalar yang cukup dapat memperluas ke nomor berapa pun.Opsi 2 - Pemindaian Jauh
Dengan meningkatkan biaya permintaan dan memperkenalkan Pemindaian Jarak Jauh, hasilnya terwujud.
sumber
Dalam keseriusan Anda tidak dapat memotong rencana eksekusi xml dari awal. Membuat mereka menggunakan SSIS adalah fiksi ilmiah. Ya itu semua XML, tetapi mereka berasal dari alam semesta yang berbeda. Melihat blog Paul tentang topik itu , dia mengatakan "banyak cara SSIS memungkinkan ..." jadi mungkin Anda salah paham? Saya tidak berpikir dia mengatakan "menggunakan SSIS untuk membuat rencana" tetapi "tidak akan bagus untuk dapat membuat rencana menggunakan antarmuka drag and drop seperti SSIS". Mungkin, untuk permintaan yang sangat sederhana, Anda bisa mengatur ini, tapi ini sulit, bahkan mungkin buang-buang waktu. Pekerjaan yang sibuk bisa Anda katakan.
Jika saya membuat rencana untuk petunjuk USE PLAN atau panduan rencana, saya punya beberapa pendekatan. Misalnya, saya dapat menghapus catatan dari tabel (misalnya pada salinan db) untuk memengaruhi statistik dan mendorong pengoptimal untuk membuat keputusan yang berbeda. Saya juga menggunakan variabel tabel sebagai ganti semua tabel dalam kueri sehingga pengoptimal berpikir setiap tabel berisi 1 catatan. Kemudian dalam paket yang dibuat, ganti semua variabel tabel dengan nama tabel asli dan tukar sebagai paket. Opsi lain adalah menggunakan opsi WITH STATS_STREAM dari UPDATE STATISTICS untuk memalsukan statistik yang merupakan metode yang digunakan ketika mengkloning salinan hanya-statistik dari basis data misalnya
Saya telah menghabiskan beberapa waktu bermain-main dengan rencana eksekusi xml di masa lalu dan saya telah menemukan bahwa pada akhirnya, SQL hanya berjalan "Saya tidak menggunakan itu" dan menjalankan kueri seperti yang diinginkan.
Untuk contoh spesifik Anda, saya yakin Anda sadar bahwa Anda dapat menggunakan set rowcount 3 atau TOP 3 dalam kueri untuk mendapatkan hasil itu, tapi saya rasa itu bukan poin Anda. The benar jawabannya benar-benar akan menjadi: menggunakan tabel temp. Saya akan menjawab bahwa:) Bukan jawaban yang benar akan "menghabiskan berjam-jam bahkan berhari-hari memotong rencana eksekusi XML kustom Anda sendiri di mana Anda mencoba untuk menipu pengoptimal untuk melakukan spool malas untuk CTE yang bahkan mungkin tidak bekerja, akan terlihat pintar tetapi juga tidak mungkin untuk mempertahankan ".
Tidak mencoba menjadi tidak konstruktif di sana, hanya pendapat saya - harapan yang membantu.
sumber
Akhirnya di SQL 2016 CTP 3.0 ada cara, jenis:)
Dengan menggunakan tanda jejak dan Acara yang Diperpanjang sebagaimana dirinci oleh Dmitry Pilugin di sini , Anda dapat (agak sewenang-wenang) memancing tiga panduan unik dari tahap-tahap menengah dari eksekusi permintaan.
NB Kode ini TIDAK dimaksudkan untuk produksi atau penggunaan serius sehubungan dengan pemaksaan rencana CTE, hanya pandangan ringan pada bendera jejak baru dan cara berbeda dalam melakukan sesuatu:
Diuji pada versi (CTP3.2) - 13.0.900.73 (x64), hanya untuk bersenang-senang.
sumber
Saya menemukan traceflag 8649 (force parallel plan) yang menginduksi perilaku ini untuk kolom panduan kiri pada contoh 2008, R2 dan 2012 saya. Saya tidak perlu menggunakan flag pada SQL 2005 di mana CTE berperilaku dengan benar. Saya mencoba menggunakan paket yang dihasilkan di SQL 2005 dalam contoh yang lebih tinggi tetapi tidak divalidasi.
Baik menggunakan petunjuk, menggunakan panduan rencana termasuk petunjuk atau menggunakan rencana yang dihasilkan oleh permintaan dengan petunjuk di dalam USE PLAN dll semua bekerja.
sumber