почему людям советуют не обновлять через просмотры

8

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

Где / Существуют ли существенные последствия для производительности? Или это больше случай, когда старшие разработчики / администраторы баз данных говорят младшему персоналу не делать этого, потому что они могут невольно нанести ущерб неправильному соединению.

РЕДАКТИРОВАТЬ
Я использую MSSQL 2000-2008 (в зависимости от особенностей клиента)

Тим Спарг
источник
Какую СУБД вы используете?
a_horse_with_no_name
@a_horse_with_no_name Обновлено, чтобы указать СУБД. Я надеялся, что ответ будет достаточно общим для всех СУБД ». Я был наивным?
Тим Спарг
Вы говорите о представлениях, которые естественно обновляются, или представлениях, для которых вам нужно было бы написать INSTEAD OFтриггер? Я не слышал этот совет, в частности, кстати, тебе никогда не давали причину?
Мартин Смит
@TimSparg: это зависит от того, как представление обновляется. Если instead ofиспользуются триггеры, то нет никакой двусмысленности, и я не вижу причины не использовать их. Но я не очень знаком с SQL Server, поэтому я не могу комментировать использование представлений без триггера.
a_horse_with_no_name
@Martin Smith Я говорю о естественно обновляемых представлениях. Мне было смутно сказано, что есть подводные камни и проблемы с производительностью, это было усилено на моем рабочем месте, где нам твердо сказали не обновлять через представления. Я начинаю думать, что это было просто то, что сказали бы старшие разработчики / администраторы баз данных, потому что они не хотели объяснять, что нужно быть осторожными при обновлении через представления (IE внутреннее против внешнего объединения)
Тим Спарг

Ответы:

10

Чтобы представление можно было обновлять без использования INSTEAD OFтриггеров «SQL Server должен иметь возможность однозначно отслеживать изменения из определения представления в одну базовую таблицу». ,

Обновление этих представлений не ухудшает производительность, так как SQL Server просто сгенерирует план запроса для базовой таблицы. Один возможный недостаток может заключаться в том, что он добавляет слой запутывания, поэтому, если вы не используете Views в качестве слоя безопасности, будет проще написать код, который непосредственно обновляет базовую таблицу.

Другой может быть, если представление содержит один ко многим, JOINи вы обновляете сторону «один» значением со стороны «многие», это не определяет, какой результат вы получите, но то же самое относится и к проприетарному UPDATE ... FROMсинтаксису SQL Server . Вам нужно будет использовать MERGEили скалярный коррелированный подзапрос, чтобы избежать этой возможной проблемы.

Для представлений, которые не могут быть обновлены и требуют INSTEAD OFтриггера, это влияет на производительность, поскольку псевдотаблицы и insertedи deletedнеобходимо генерировать из базовой таблицы, поэтому, если возможно, непосредственное обновление базовых таблиц, вероятно, будет более эффективным.

Мартин Смит
источник