История о данных: а был ли объект?
Переписывание запросов
В ранних версиях SQL Server переписывание запросов выполнялось чрезвычайно редко, и я не ставлю это в вину разработчикам. Ведь всякий раз, переписывая подготовленный кем-то запрос, мы рискуем исказить намерение автора. В ранних версиях SQL Server использовалось множество предикатов, от которых можно было полностью отказаться. Сейчас я продемонстрирую вам пример того, как они используются в текущих версиях SQL Server. Рассмотрим версию запроса, приведенную на экране выше (план этого запроса показан на экране ниже).
Обратите внимание на то, что в плане запроса таблица Sales. SalesOrderHeader не упоминается. И опять на помощь пользователю приходит оптимизатор. Он определил, что ни одна из строк никогда не сможет соответствовать обоим предикатам в одно и то же время:
SalesOrderlD <100
SalesOrderlD > 100SQL Server пришел к заключению, что ему нет необходимости даже рассматривать данную таблицу. Это важная концепция, так как многие запросы действительно нужно переписывать. Рассмотрим необычный предикат, показанный на экране выше. Должен вам сказать, что с такими запросами системе SQL Server приходится иметь дело практически ежедневно. Вы можете считать, что никто, находясь в здравом уме и твердой памяти, не станет использовать подобные логические конструкции, однако именно такой бестолковый код выдают генераторы запросов.
Поручить системе SQL Server заняться переписыванием запросов, перед тем как запускать их на выполнение, — это весьма обоснованная идея.
Пределы разумности
Однако постоянно рассчитывать на «бесплатный сыр» не приходится. SQL Server не может затрачивать слишком много времени на размышления о том, как выполнить тот или иной запрос. Иногда системе нужно просто выполнить его. Это мы можем позволить себе роскошь всестороннего рассмотрения проблемы, a SQL Server не в состоянии целый день решать логические загадки и лишь после этого переходить к выполнению запроса. Оптимизатору известно множество способов зашиты человека от самого себя, но он отнюдь не совершенен. Всегда, когда это возможно, пишите код, который облегчает работу оптимизатора. И. что еще более важно, пишите код, который коллегам было бы легко читать и использовать, иначе говоря, код, в котором явно прослеживаются ваши намерения. Если вы просто хотите уточнить, существует ли тот или иной объект, используйте запрос EXISTS.