Приклад коду в цьому елементі підключення
Показує помилку де
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)
потрібно щонайменше три таблиці, і ця умова, безумовно, не виконується в першому прикладі.