Przykładowy kod w tym elemencie łączenia
Pokazuje błąd gdzie
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Zwraca prawidłowe wyniki. Jednak poniższe wyniki zwracają niepoprawne wyniki (w 2014 r. Przy użyciu nowego narzędzia Kardynalność)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Ponieważ niepoprawnie ładuje wyniki dla L2 do wspólnej bufora podwyrażeń, następnie odtwarza wynik tego dla wyniku L1.
Byłem ciekawy, dlaczego różnica w zachowaniu między tymi dwoma zapytaniami. Flaga śledzenia 8675 pokazuje, że ten, który działa, wchodzi, search(0) - transaction processing
a ten, który zawodzi search(1) - quick plan
.
Zakładam więc, że dostępność dodatkowych reguł transformacji kryje się za różnicą w zachowaniu (na przykład wyłączenie BuildGbApply lub GenGbApplySimple to naprawia).
Ale dlaczego dwa plany dotyczące tych bardzo podobnych zapytań napotykają różne fazy optymalizacji? Z tego, co przeczytałem, search (0)
wymagane są co najmniej trzy tabele, a warunek ten z pewnością nie jest spełniony w pierwszym przykładzie.
źródło