Представления могут снизить производительность, если представление содержит логику, столбцы, строки или таблицы, которые в конечном итоге не используются в вашем конечном запросе. Я не могу сказать вам, сколько раз я видел такие вещи, как:
SELECT ...
FROM (View with complex UNION of ActiveCustomer and InactiveCustomer tables)
WHERE Active = True
(таким образом, отфильтровывая все строки, которые были включены в представление из таблицы InactiveCustomer), или
SELECT (one column)
FROM (view that returns 50 columns)
(SQL должен извлечь много данных, которые затем отбрасываются на более позднем этапе. Возможно, что другие столбцы могут быть дорогими для извлечения, например, при поиске по закладкам), или
SELECT ...
FROM (view with complex filters)
WHERE (entirely different filters)
(вполне вероятно, что SQL мог бы использовать более подходящий индекс, если таблицы запрашивались напрямую),
или
SELECT (only fields from a single table)
FROM (view that contains crazy complex joins)
(большая загрузка ЦП при объединении и ненужный ввод-вывод для операций чтения таблицы, которые впоследствии отбрасываются) или мой любимый:
SELECT ...
FROM (Crazy UNION of 12 tables each containing a month of data)
WHERE OrderDate = @OrderDate
(Читает 12 таблиц, когда действительно нужно прочитать только 1).
В большинстве случаев SQL достаточно умен, чтобы «проследить сквозь крышки» и в любом случае придумать эффективный план запросов. Но в других случаях (особенно очень сложных) это невозможно. В каждой из вышеперечисленных ситуаций ответ состоял в том, чтобы удалить представление и запросить базовые таблицы.
По крайней мере по крайней мере (даже если вы думаете, что SQL все равно будет достаточно умен, чтобы оптимизировать его), устранение представления иногда может упростить отладку и оптимизацию ваших запросов (немного более очевидно, что нужно быть сделано).