Apa Aturan Menentukan Ketika SQL Server Menggunakan CTE sebagai "Pagar Pengoptimalan"?

10

Beberapa waktu yang lalu, Brent Ozar menerbitkan sebuah pos yang merinci beberapa perbedaan antara SQL Server dan PostgreSQL:

Dua Perbedaan Penting Antara SQL Server dan PostgreSQL

Poin pertama ("CTE adalah pagar optimasi") menarik perhatian saya, karena jelas bahwa dalam contoh yang diberikan, SQL Server menggabungkan CTE dan kueri utama bersama-sama dan mengoptimalkannya sebagai kueri tunggal (sebagai lawan dari perilaku berlawanan di PostgreSQL).

Namun, perilaku ini tampaknya bertentangan dengan contoh yang saya lihat di blog lain dan kelas pelatihan, di mana SQL Server memperlakukan CTE sebagai pagar pengoptimalan, yang memungkinkan penggunaan indeks yang lebih baik, kinerja yang lebih baik, dll. Misalnya:

Cara Yang Lebih Baik Untuk Memilih Bintang

Jadi, sepertinya SQL Server "menghormati" CTE sebagai pagar pengoptimalan TERKADANG. Apakah ada sumber daya baik yang tersedia yang mendokumentasikan daftar kasus tertentu yang diketahui di mana SQL Server akan secara andal menghormati CTE sebagai pagar pengoptimalan (atau perilaku yang berlawanan)?

Bryan Rebok
sumber

Jawaban:

10

... daftar kasus yang diketahui di mana SQL Server akan secara terhormat menghormati CTE sebagai pagar pengoptimalan

Daftar seperti itu akan bergantung pada perilaku yang diamati, tanpa jaminan keandalan.

Pengoptimal kueri SQL Server tidak pernah memperlakukan ekspresi tabel umum sebagai pagar optimasi sendiri , meskipun beberapa konstruksi jelas sulit untuk dioptimalkan. CTE rekursif adalah contoh yang baik untuk ini.

CTE diperlakukan sangat mirip dengan fungsi tampilan / inline / subkueri / tabel turunan dan diuraikan ke dalam kueri. Perilaku 'pagar' yang diamati tergantung pada pengoptimal yang tidak mampu, atau memutuskan untuk tidak, mengoptimalkan melintasi batas permeabel yang pada prinsipnya.

Secara umum, CTE yang lebih sederhana dan lebih 'relasional' adalah, semakin besar kemungkinan pengoptimal akan dapat memindahkan bit.

Fitur yang memungkinkan pengoptimal untuk mempertimbangkan, atau memaksanya untuk mewujudkan 'hasil' CTE telah disarankan, tetapi belum diimplementasikan:

Sementara itu, solusi yang paling umum adalah secara eksplisit mewujudkan hasil antara yang ditetapkan dalam tabel sementara atau variabel tabel. Ini jelas membutuhkan skenario yang tidak terbatas pada satu pernyataan.

Paul White 9
sumber