Contoh kode dalam item sambung ini
Menunjukkan bug di mana
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Mengembalikan hasil yang benar. Tetapi yang berikut ini mengembalikan hasil yang salah (pada 2014 menggunakan Cardinality Estimator yang baru)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Karena itu salah memuat hasil untuk L2 ke dalam gulungan sub ekspresi umum kemudian memutar ulang hasilnya untuk hasil L1.
Saya ingin tahu mengapa perbedaan perilaku antara dua pertanyaan. Bendera Trace 8675 menunjukkan bahwa yang berfungsi masuk search(0) - transaction processing
dan yang gagal masuk search(1) - quick plan
.
Jadi saya berasumsi bahwa ketersediaan aturan transformasi tambahan berada di belakang perbedaan perilaku (menonaktifkan BuildGbApply atau GenGbApplySimple tampaknya memperbaikinya misalnya).
Tetapi mengapa kedua rencana untuk kueri yang sangat mirip ini mengalami fase optimasi yang berbeda? Dari apa yang saya baca search (0)
membutuhkan setidaknya tiga tabel dan kondisi itu tentu tidak terpenuhi pada contoh pertama.