Представление быстрее, чем простой запрос?

На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.

Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.

328
задан Peter Mortensen 27 August 2012 в 07:13
поделиться

11 ответов

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

Обновление: По крайней мере три человека провалили меня на этом. Со всем должным уважением я думаю, что они просто неправы; собственная документация Microsoft делает его очень ясным, что Представления могут улучшить производительность.

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

Позволяют мне перейти непосредственно к документации:

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

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

Снова, документация:

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

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

Обновление 2: ответ был подвергнут критике на основании, что это - "индекс", который обеспечивает преимущество производительности, не "Представление". Однако это легко опровергнуто.

Позволяют нам сказать, что мы - компания-разработчик программного обеспечения в небольшой стране; я буду использовать Литву в качестве примера. Мы продаем программное обеспечение во всем мире и ведем наш учет в базе данных SQL Server. Мы очень успешны и так за несколько лет, мы имеем 1,000,000 + записи. Однако мы часто должны сообщать о продажах в целях налогообложения, и мы находим, что только продали 100 копий нашего программного обеспечения в нашей родной стране. Путем создания индексного представления просто литовских записей мы добираемся для ведения учета, в котором мы нуждаемся в индексируемом кэше, как описано в документации MS. Когда мы выполним наши отчеты для литовских продаж в 2008, наш запрос перероет индекс с глубиной всего 7 (Log2 (100) с некоторыми неиспользованными листами). Если бы мы должны были сделать то же без ПРЕДСТАВЛЕНИЯ и просто доверия индексу в таблицу, мы должны были бы пересечь индексное дерево с поисковой глубиной 21!

Очевидно, само Представление предоставило бы нам преимущество производительности (3x) по простому использованию одного только индекса. Я попытался использовать реальный пример, но Вы отметите, что простой список литовских продаж дал бы нам еще большее преимущество.

Примечание, что я просто использую прямое B-дерево для своего примера. В то время как я вполне уверен, что SQL Server использует некоторый вариант B-дерева, я не знаю детали. Тем не менее, точка содержит.

Обновление 3: вопрос подошел о том, использует ли Индексное представление просто индекс, помещенный в базовую таблицу. Таким образом, для перефразирования: "индексное представление является просто эквивалентом стандартного индекса, и это не предлагает ничто нового или уникальный для представления". Если бы это было верно, конечно, то вышеупомянутый анализ был бы неправильным! Позвольте мне обеспечить кавычку из документации Microsoft, которые демонстрируют, почему я думаю, что эта критика не допустима или верна:

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

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

613
ответ дан 8 revs, 2 users 88% 23 November 2019 в 00:48
поделиться

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

Теперь, если Вы делаете сложный запрос, создают представление.

0
ответ дан 23 November 2019 в 00:48
поделиться

Определенно представление лучше, чем вложенный запрос для SQL Server. Не зная точно, почему это лучше (пока я не читал сообщение Mark Brittingham), я запустил некоторые тесты и испытал почти шокирующие повышения производительности при использовании представления по сравнению с вложенным запросом. После выполнения каждой версии запроса несколько сотен раз подряд, версии представления запроса, завершенного в половину времени. Я сказал бы, что это - доказательство достаточно для меня.

3
ответ дан 23 November 2019 в 00:48
поделиться

Должно быть некоторое тривиальное усиление в хранении плана выполнения, но это будет незначительно.

0
ответ дан JosephStyons 23 November 2019 в 00:48
поделиться

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

4
ответ дан Peter Mortensen 23 November 2019 в 00:48
поделиться

Существует не практичен отличающийся и если Вы считаете BOL, то Вы найдете, что когда-либо Ваш простой ВЫБОР SQL * ОТ X действительно использует в своих интересах план, кэширующийся и т.д.

0
ответ дан keithwarren7 23 November 2019 в 00:48
поделиться

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

5
ответ дан Peter Mortensen 23 November 2019 в 00:48
поделиться

РЕДАКТИРОВАНИЕ: Я был неправ, и необходимо видеть , отмечает ответ выше.

я не могу говорить на основе опыта с SQL  Сервер , но для большинства баз данных ответ был бы нет. Единственная потенциальная польза, которую Вы извлекаете, мудрая производительность, от использования представления, - то, что это могло потенциально создать некоторые пути доступа на основе запроса. Но главная причина использовать представление состоит в том, чтобы упростить запрос или стандартизировать способ получить доступ к некоторым данным в таблице. Вообще говоря, Вы не получите выигрыш в производительности. Я могу быть неправым, все же.

я придумал бы умеренно более сложный пример и время это самостоятельно для наблюдения.

13
ответ дан Community 23 November 2019 в 00:48
поделиться

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

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

существует важная ссылка в Книгах Онлайн в отношении разрешение представления .

Вот статья, которая описывает преимущества и создание индексных представлений :

Много лет, MicrosoftВ® SQL Serverв „ў поддерживал способность составить виртуальные таблицы, известные как представления. Исторически, эти представления служили этим основным целям:

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

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

С SQL Server 2000, функциональность представлений SQL Server была расширена для предоставления преимуществ производительности системы. Возможно создать уникальный кластерный индекс на представлении, а также некластеризируемые индексы, улучшить производительность доступа к данным относительно наиболее сложных запросов. В SQL Server 2000 и 2005, представление, которое имеет уникальный кластерный индекс, упоминается как индексное представление.

41
ответ дан Peter Mortensen 23 November 2019 в 00:48
поделиться

В SQL Server, по крайней мере, Планы запросов хранятся в кэше плана для обоих представлений и обычных SQL-запросов, на основе параметров запроса/представления. Для обоих они отбрасываются от кэша, когда они были не использованы в течение достаточно долгого периода, и пространство необходимо для некоторого другого недавно отправленного запроса. После которого, если выпущен тот же запрос, он перекомпилирован, и план отложен в кэш. Так не, нет никакого различия, учитывая, что Вы снова используете тот же SQL-запрос и то же представление с той же частотой.

, Очевидно, в целом, представление, он - очень природа (Что кто-то думал, что это должно было использоваться достаточно часто для превращения его в представление), более вероятно, будет, обычно "снова использоваться", чем какой-либо произвольный SQL-оператор.

13
ответ дан Charles Bretana 23 November 2019 в 00:48
поделиться

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

1
ответ дан Tony Andrews 23 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: