Bu bağlantı öğesindeki örnek kod
Nerede bir hata gösterir
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Doğru sonuçları verir. Ancak aşağıdakiler yanlış sonuçlar döndürür (2014'te yeni Kardinalite Tahmincisi'ni kullanarak)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
L2 için sonuçları ortak bir alt ifade makarasına yanlış yükledikten sonra L1 sonucu için sonucu tekrarlar.
İki sorgu arasındaki davranış farkının neden olduğunu merak ettim. İzleme Bayrağı 8675, işe yarayanın girip search(0) - transaction processing
başarısız olanın girdiğini gösterir search(1) - quick plan
.
Bu nedenle, ek dönüşüm kurallarının kullanılabilirliğinin davranıştaki farkın arkasında olduğunu varsayalım ( örneğin, BuildGbApply veya GenGbApplySimple'ı devre dışı bırakmak gibi görünüyor).
Peki, bu çok benzer sorgular için iki plan neden farklı optimizasyon aşamalarıyla karşılaşıyor? Ne okudum itibaren search (0)
en az üç tablo gerektirir ve bu durum kesinlikle ilk örnekte karşılanmaz.