Использовать SQL-представление или SQL-запрос?

Я работаю над приложением для получения данных с сервера MS-SQL (2005). В тексте команды я могу передать запрос sql следующим образом:

string query = "SELECT T1.f1, T1.f2, T2.f3 FROM table1 T1 join table2 T2" +
   "on T1.id = T2.id AND T1.dt = T2.dt ..."
....
cmd.CommandText = query;

Я мог бы также поставить запрос как представление на моем SQL-сервере следующим образом:

 CREATE VIEW V1 AS
   "SELECT T1.f1, ..."

Тогда я могу использовать представление в упрощенном запросе вроде этого:

 string query = "SELECT f1, f2, f3 FROM V1";
 ....
 cmd.CommandText = query;

Я не уверен, какой путь лучше. Будет ли представление быстрее, чем SQL-запрос? Кстати, запрос, который я показываю здесь, является упрощенным. Фактический запрос SELECT более сложный.

c#,sql-server,

8

Ответов: 9


16 принят

Я бы создал VIEW по нескольким причинам

A) Хорошо построенный вид имеет тенденцию работать быстрее, чем запрос, хотя при оптимизации запросов вы можете не заметить большой разницы.

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

C) Если вам нужно внести структурные изменения в базу данных, вы можете сохранить представление согласованным, не перестраивая свой код.

ПОПРАВКА Я собираюсь изменить этот ответ в свете некоторых комментариев, чтобы уточнить некоторые моменты ...

Совершенно верно, что стандартное представление не обеспечивает реального прироста производительности по запросу. Стандартное представление материализуется во время выполнения, что существенно отличает его от удобного способа выполнения запроса той же структуры. Однако представление в индексе материализуется немедленно, и результаты сохраняются в физическом хранилище. Как и при любом дизайнерском решении, следует внимательно изучить использование индексированного представления. Нет бесплатного обеда; штраф, который вы платите за использование индексированных просмотров, возникает в виде дополнительных требований к хранению и накладных расходов, связанных с сохранением представления при наличии каких-либо изменений в базовой базе данных. Они лучше всего используются в случаях часто используемого сложного объединения и агрегирования данных из нескольких таблиц и в случаях, когда доступ к данным происходит гораздо чаще, чем он изменяется.

Я также согласен с комментариями относительно структурных изменений - добавление новых столбцов не повлияет на представление. Если, однако, данные перемещаются, нормализуются, архивируются и т. Д., Это может быть хорошим способом изолировать такие изменения от приложения. Эти ситуации являются РЕДКО, и одни и те же результаты могут быть достигнуты за счет использования хранимых процедур, а не вида.


3

В общем, я нашел, что лучше использовать представления по нескольким причинам:

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

Есть, вероятно, больше причин, но на данный момент я никогда не буду писать запрос непосредственно в коде.

Вы также должны изучить какую-либо технологию ORM (Object Relational Mapper), такую ??как LINQ to SQL (L2S). Он позволяет использовать SQL-подобные запросы в коде, но все абстрагируется с помощью объектов, созданных в дизайнере L2S.

(Фактически, я фактически перемещаю наши текущие объекты L2S, чтобы убежать от представлений. Это немного сложнее, потому что отношения также не проходят ... но это позволяет мне создать один набор объектов, которые проходят через 2 базы данных и сохранить все красиво абстрагированным, чтобы я мог изменить имена базовых таблиц, чтобы исправить соглашения об именах.)


2

Или вы можете использовать хранимую процедуру. Использование сохраненного proc позволит SQL кэшировать план выполнения. Я думаю, что то же самое верно и для представления. Ваш первый метод (ad-hoc query), вероятно, будет наименее эффективным.


2

Разницы в производительности нет (если текст запроса sql по-настоящему гигантский и не несет затрат на провод).


1

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

Реальная разница и ценность Views - это то, что подобно функциям и подпрограммам они могут использоваться повторно .

C #, SQL-сервер,
Похожие вопросы