Имеет ли значение, если вы фильтруете представление внутри или снаружи представления?
Например, есть ли разница между этими двумя запросами?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Или
SELECT Id
FROM MyView
WHERE SomeColumn = 1
И MyView
определяется как
SELECT Id, SomeColumn
FROM MyTable
И отличается ли ответ, если исходная таблица расположена на связанном сервере?
Я спрашиваю, потому что я должен дважды запросить большую таблицу (44 миллиона строк) со связанного сервера, и получить совокупность результатов. Я хочу знать, должен ли я создать два представления для доступа к данным, по одному для каждого запроса, или мне удастся выбрать одно представление и WHERE
предложение.
UNION ALL
. Гораздо проще использовать View, чем переписывать запрос UNION каждый раз, когда мне нужны данные.Ответы:
Вы не должны видеть абсолютно никакой разницы в планах или производительности между этими двумя вариантами. Когда представление запрашивается, оно расширяется до запроса к базовой таблице, что означает, что будет использоваться тот же поиск или сканирование.
Теперь, в зависимости от типа данных и избирательности
MyColumn
, если вы хотите создать отфильтрованный индекс для базовой таблицы (при переходе на SQL Server 2008+), вы можете получить более высокую производительность, но это снова не изменится через представление или без.источник
where
предложением вне представления занимает намного больше времени, чем когда он помещается в представление?Вот только быстрый пример, показывающий, что не должно быть никакой разницы. База данных является
AdventureWorks
базой данных.Два вида определения:
Здесь будет первый запрос с
WHERE
предложением, включенным в определение представления:Вот план выполнения:
И второй запрос, с
WHERE
предложением не в определении представления, а вSELECT
запросе:Вот этот план выполнения:
Как видно из этих планов выполнения, они идентичны с одинаковыми результатами. Я не знаю ситуации, когда этот тип логики / дизайна давал бы разные результаты. Так что я хотел бы сказать, что вы в любом случае в безопасности, и придерживайтесь личных предпочтений (или процедур магазина).
источник
where
предложением вне представления занимает намного больше времени, чем когда он помещается в представление?Where
предложение соответствуетPARTITION BY
. В SQL Server 2008, похоже, есть новое правилоSelOnSeqPrj
для распознавания этого конкретного случая.Исходя из того, что я читаю , SQL будет использовать стандартное представление, например подзапрос, при определении плана выполнения.
Итак, используя мой пример запроса,
где
MyView
определяется какон должен генерировать тот же план выполнения, что и
но этот план выполнения может отличаться от того, что будет сгенерировано с
Я не уверен, что этот ответ будет таким же для индексированных представлений
источник
sp_refreshview
это необходимо, а концепция замены текста - нет.