Der Beispielcode in diesem Verbindungselement
Zeigt einen Fehler wo
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Liefert die korrekten Ergebnisse. Das Folgende gibt jedoch falsche Ergebnisse zurück (2014 mit dem neuen Kardinalitätsschätzer)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Wenn die Ergebnisse für L2 fälschlicherweise in eine gemeinsame Unterausdrucks-Spool geladen werden, wird das Ergebnis für das L1-Ergebnis erneut abgespielt.
Ich war neugierig, warum sich die beiden Fragen unterschiedlich verhielten. Trace Flag 8675 zeigt, dass derjenige, der funktioniert, search(0) - transaction processing
und derjenige, der fehlschlägt, eintrifft search(1) - quick plan
.
Daher gehe ich davon aus, dass die Verfügbarkeit zusätzlicher Transformationsregeln für das unterschiedliche Verhalten verantwortlich ist (das Deaktivieren von BuildGbApply oder GenGbApplySimple scheint dies beispielsweise zu beheben).
Warum stoßen die beiden Pläne für diese sehr ähnlichen Abfragen auf unterschiedliche Optimierungsphasen? Nach dem, was ich gelesen habe, search (0)
sind mindestens drei Tabellen erforderlich, und diese Bedingung ist im ersten Beispiel sicherlich nicht erfüllt.
quelle