2015-03-21 8 views
0

Я новичок в веб-разработке.Сохраняют ли хранимые процедуры производительность?

У меня есть сервер приложений, где находится мой код ASP.NET. Мой сервер приложений связывается с экземпляром MySQL, который находится на другом сервере. Мне было интересно, стоит ли переводить вычисления с сервера приложений на сервер базы данных с помощью хранимой процедуры с представлениями или просто переходить ко всей логике, хранящейся на сервере приложений, и запрашивать базу данных только для извлечения данные из таблиц непосредственно без хранения процедур и представлений.

+0

Это решение не должно затрагиваться «исполнением» без четкого варианта использования, когда/что должно «улучшить». (Большая часть преимуществ будет достигнута только благодаря хорошему дизайну схемы/транзакции и правильным индексам с использованием методов SPROC/BULK/etc и оптимизации запросов, как указано в фактических номерах производительности.) И мне не хочется развлекать дискуссию SPROC-vs-NO-SPROC этим утром. – user2864740

ответ

3

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

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

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

Другие причины, по которым приходят на ум:

  • Та же логика привыкает за то же самое. То есть, одна часть кода не определяет «foobar» в одну сторону, а другую «foobar» другим способом.
  • Аудит и ведение журнала осуществляются в хранимых процедурах, а не с использованием триггеров.
  • Таблицы базы данных запрещены для всех пользователей, если они не проходят через определенный интерфейс.
  • Более новая версия и более ранняя версия могут часто сосуществовать.

Следует признать, что для одноразового, быстрого и грязного применения эти проблемы могут быть не важны. Тем не менее, я думаю, что неплохо иметь четко определенные интерфейсы (API) между различными компонентами системы, а базы данных и прикладной уровень - яркий пример, когда такие API очень полезны.

1

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

  • PHP (и т. Д.) Гораздо более выразителен, чем SProcs.
  • Один SProc может выполнять несколько запросов быстрее, потому что он ближе к серверу. Это может быть огромным выигрышем в производительности, если клиент и сервер находятся на разных сторонах страны.
  • Проверка ошибок является неуклюжей в SProcs.
  • PHP перекомпилируется только при изменении кода; SProcs перекомпилирует один раз за соединение; Perl всегда перекомпилирует;
  • VIEWs иногда плохо оптимизированы, поэтому я избегаю их.

Секрет хорошей конструкции для «слоя» заключается в компромиссе между силами, тянущимися с обеих сторон. Один пример: можете ли вы полностью скрыть изменение схемы из приложения? Даже если вы разделите одну таблицу на две?

Действительно плохо, когда пользовательский интерфейс делал разбивку на страницы, используя номера страниц. Слой думал с точки зрения OFFSET и LIMIT, и передал его в исходный код MySQL. Затем появился элемент на страницах 216K (да, многие!). Они выяснили, что OFFSET + LIMIT не является хорошим способом реализации «следующей страницы», но для его исправления требуются изменения во всех слоях системы.

+0

Итак, как они изменили OFFSET LIMIT? Я все еще использую его, я не понимаю. – mzvarik

+1

Подробнее о разбиении на страницы и 'OFFSET': http://mysql.rjweb.org/doc.php/pagination. Возможный пример: URL-адрес страницы 5 «http ...? Page = 5'; код строит 'SELECT ... LIMIT 40, 10', где 40 = (5-1) * 10 и 10 - количество элементов на странице. –