(Lots more joins)
ГДЕ Table1.Col1 = dbo.fnGetSomeID () И (дополнительные проверки)
Это не очень хорошая проблема. Наконец, не должно иметь значения, возвращается ли значение функцией, подзапросом или переменной или является константой. Но это так, и на некотором уровне сложности очень трудно получить согласованные результаты. И вы не можете отладить его, потому что ни вы, ни кто-либо еще здесь не можете вглядываться в черный ящик, который является оптимизатором запросов. Все, что вы можете сделать, это ткнуть в него и посмотреть, как он себя ведет.
Я думаю, что оптимизатор запросов ведет себя хаотично, потому что в запросе много таблиц. Когда вы говорите, что нужно искать 1
, он смотрит на статистику индекса и делает хороший выбор. Когда вы говорите ему что-нибудь еще, он предполагает, что он должен присоединиться, основываясь на том, что он делает
знаете, не доверяя вашей функции / переменной, чтобы вернуть выборочное значение. Для этого значение Table1.Col1 должно иметь неравномерное распределение значений. Или оптимизатор запросов не является оптимальным.
В любом случае примерный план запроса должен показать разницу. Ищите возможности добавить (или, иногда, удалить) индекс. Это может быть план 3.5 во многих случаях, и сервер действительно хочет получить лучшие показатели.
Помимо этого - догадки. Иногда, к сожалению, ответ заключается в том, чтобы найти подмножество таблиц, которые производят небольшой набор строк, поместить их во временную таблицу и соединить их с остальными таблицами. Подсказка OPTIMIZE FOR
тоже может быть полезна.
Имейте в виду, однако, что любое решение, которое вы получите, будет хрупким, зависит от данных и версии.