Использование представлений вместо таблиц в хранимых процедурах? - PullRequest
3 голосов
/ 05 февраля 2011

Является ли хорошей практикой запрашивать представления вместо необработанных таблиц в хранимых процедурах?(даже если представление не предоставляет никаких других данных)

Я всегда полагал, что это может быть хорошей идеей, потому что это дополнительный уровень абстракции и он похож на использование свойств вместо переменных-членов в функциях класса.

Но теперь я просматривал хранимые процедуры, созданные провайдером членства ASP.NET, и они всегда запрашивают таблицы напрямую.

Я знаю, что вы не можете легко вставить данные при использовании представлений, ноесли хранимая процедура запрашивает только данные, следует ли вам использовать таблицы напрямую?Если да, в чем основная причина?(Производительность?)

Ответы [ 4 ]

6 голосов
/ 05 февраля 2011

Представление - это просто макрос, который расширяется во внешний запрос.

Если ваше представление содержит несколько объединений, то при присоединении к другим представлениям вы внезапно получаете 20 или 30-полосное соединение, когда вы фактически видите 3 соединения в SQL хранимой процедуры. Вы также обнаружите, что каждый запрос отличается: зачем объединять 20 или 30 таблиц для каждого запроса?

Как правило, нет никакой выгоды, если представление проиндексировано / материализовано и оптимизатор может его использовать.

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

Использование хранимой процедуры уже означает отсутствие доступа к базовой таблице (цепочка владения).

Существует хорошее использование представлений, чтобы избежать прямого доступа пользователей к таблицам, или для маскировки изменений схемы, или для обеспечения некоторой базовой безопасности (например, на основе SUSER_SNAME), но не для производительности или идеологии

3 голосов
/ 05 февраля 2011

Разные оптимизаторы базы данных оптимизируют запросы по-разному, так что это не простой ответ. Но обычно добавление слоя абстракции может (не обязательно) помешать оптимизатору правильно использовать индексы.

В Sql Server, если у вас есть предложение where, содержащее такие вызовы, как:

  • ЕСТЬ НУЛЬ
  • НРАВИТСЯ '% что-то'
  • НЕ СУЩЕСТВУЕТ

делает его несаргируемым запросом, то есть запросом, который не использует индексы или использует их неоптимально.

Я бы предположил, что использование представления также повлияет на сарг. Я пойду и протестирую это (на Sql Server) - я вернусь через 5 минут.

EDIT

Полагаю, что ответ «это зависит», и вам нужно обязательно включить план выполнения запроса. Следующий тест, который я провел, не показал разницы между запросом простого представления на основе таблицы и простым запросом базовая таблица. Но это требует дальнейшего тестирования, поскольку сложное представление может действовать по-другому.

Sql Execution Plan for accessing a simple view compared to the table directly

0 голосов
/ 09 февраля 2011

В SQL Server (по крайней мере) я понимаю, что хранимые процедуры оптимизируются во время компиляции и поэтому в целом более эффективны, чем представления.Я не уверен, но я подозреваю, что, выполняя SPRC против представления, вы можете потерять любую оптимизацию, полученную таким образом.

Далее, почему?Как и в предыдущем постере, вы можете выполнять больше соединений, чем нужно, если одно или несколько представлений, которые вы включаете, сами состоят из многочисленных объединений, и это не будет очевидно.

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

Поскольку хранимая процедура по своему дизайну принимает параметры, не позволяет пользователю напрямую взаимодействовать с данными таблицы и может выполнять любую логику запроса, которую вы можете использовать в представлении (плюс многое другое), кажется, чтоЯ считаю, что (за некоторыми исключениями) главная причина, по которой можно это сделать, состоит в том, чтобы упростить CODING при потенциальной стоимости производительности и ремонтопригодности (что если кто-то изменит одно из представлений, не осознавая, что ваш SPROC зависит от него?)

Я рекомендую закодировать все это в SPROC, если нет веских оснований поступить иначе.,.

0 голосов
/ 05 февраля 2011

Я использовал представления в хранимых процедурах в этих двух случаях:

1 - для сложных объединений или условий, необходимых для нескольких процедур

2 - заменить переименованную таблицу. Например, у меня было две таблицы, названные 'member' и 'non_member'. Позже я решил объединить их в «пользовательскую» таблицу. Чтобы избежать изменения каждого процесса, который я когда-либо писал, я создал представления с именами 'member' и 'non_member', которые использовали предложения where для соответствующей фильтрации таблицы 'user'. Все процы работали как обычно без изменений. Я могу изменить их, чтобы получить доступ к новой таблице напрямую, когда у меня будет время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...