Добавление внутреннего запроса не меняет план выполнения - PullRequest
2 голосов
/ 28 июня 2010

Рассмотрим следующие запросы.

select * from contact where firstname like '%some%'

select * from 
    (select * from contact) as t1 
where firstname like '%some%'

Планы выполнения для обоих запросов одинаковы и выполняются одновременно.Но я ожидал, что второй запрос будет иметь другой план и будет выполняться медленнее, поскольку он должен выбрать все данные из контакта и применить фильтр.Похоже, я был неправ.

Мне интересно, как это происходит?

Сервер базы данных: SQL-сервер 2005

1 Ответ

6 голосов
/ 28 июня 2010

«Оптимизатор запросов» - это то, что происходит.Когда вы запускаете запрос, SQL Server использует оптимизатор на основе затрат, чтобы определить, что, вероятно, будет лучшим способом выполнить этот запрос (т. Е. Это план выполнения).Подумайте об этом как о карте маршрута от места А до места Б. Может быть много разных способов добраться от А до Б, некоторые будут быстрее, чем другие.SQL Server будет разрабатывать различные маршруты для достижения конечной цели возврата данных, которые удовлетворяют запросу, и использовать тот, который имеет приемлемую стоимость.Обратите внимание, что это не обязательно анализировать КАЖДЫЙ возможный способ, так как это было бы излишне дорого.

В вашем случае оптимизатор установил, что эти 2 запроса могут быть свернуты до одного и того же, поэтомутот же план.

...