#view #sql-server-2008-r2
#Вид #sql-server-2008-r2
Вопрос:
Если у меня есть ПРЕДСТАВЛЕНИЕ с кучей ВНУТРЕННИХ соединений, но я запрашиваю это ПРЕДСТАВЛЕНИЕ, выбирая только столбцы, которые поступают из основной таблицы, будет ли SQL Server игнорировать ненужные соединения в ПРЕДСТАВЛЕНИИ во время выполнения или эти соединения все равно должны выполняться по какой-то причине?
Если это делает другое, это на SQL Server 2008 R2. Я знаю, что в любом случае это уже не лучшее решение, но я пытаюсь найти меньшее из 2 зол.
Ответ №1:
Он может игнорировать соединения, если они фактически не изменяют семантику. Одним из примеров этого может быть, если у вас есть ограничение доверенного внешнего ключа между таблицами, и вы выбираете только столбцы из ссылочной таблицы (см. Пример 9 в этой статье).
Вам нужно будет проверить план выполнения, чтобы быть уверенным в вашем конкретном случае.
Комментарии:
1. Хорошая статья, именно то, что я искал, спасибо. Как вы могли догадаться, учитывая, что я задаю этот вопрос в первую очередь, отношения FK в этой БД практически не существуют. Теперь я понимаю, почему у оптимизатора практически нет шансов помочь мне в этом сценарии, и мой план выполнения предполагает то же самое.
Ответ №2:
Если вы не извлекаете поля из этих таблиц, может быть быстрее использовать EXISTS
предложение — это также предотвратит дублирование из JOIN
таблицы редактирования, которое приведет к дублированию ваших результатов.
Ответ №3:
Даже если оптимизатор игнорирует ненужные объединения, вам следует просто создать другое представление для обработки вашего конкретного случая. Использование и злоупотребление представлениями (например, в этом случае) может выйти из-под контроля и привести к запутыванию, путанице и очень значительным проблемам с производительностью.
Вы могли бы даже рассмотреть возможность рефакторинга представления, которое вы планируете использовать, присоединив его к набору «меньших» представлений для предоставления того же набора данных, что и сейчас … если, конечно, это имеет смысл.