Пример кода в этом элементе подключения
Показывает ошибку где
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Возвращает правильные результаты. Но следующее возвращает неверные результаты (в 2014 году с использованием нового Оценщика мощности)
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 в общую катушку подвыражения, то воспроизводит результат этого для результата L1.
Мне было любопытно, почему разница в поведении между двумя запросами. Флаг трассировки 8675 показывает, что работает тот, кто работает, search(0) - transaction processing
и тот, кто не работает search(1) - quick plan
.
Поэтому я предполагаю, что доступность дополнительных правил преобразования лежит в основе различий в поведении (отключение BuildGbApply или GenGbApplySimple, кажется, исправляет это).
Но почему два плана для этих очень похожих запросов сталкиваются с разными фазами оптимизации? Из того, что я прочитал, search (0)
требуется как минимум три таблицы, и это условие, безусловно, не выполняется в первом примере.