У вас может быть слишком много хранимых процедур? - PullRequest
13 голосов
/ 26 сентября 2008

Есть ли такая вещь, как слишком много хранимых процедур?

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

Ответы [ 19 ]

8 голосов
/ 26 сентября 2008
5 голосов
/ 26 сентября 2008

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

При этом вы должны проектировать / создавать столько, сколько требует ваше приложение. Хотя с Hibernate, NHibernate, .NET LINQ я бы постарался сохранить как можно больше логики процедур хранения в коде и помещать ее в базу данных только тогда, когда скорость имеет значение.

4 голосов
/ 27 сентября 2008

Я предполагаю, что более глубокий вопрос здесь - куда еще должен идти весь этот код? Представления могут использоваться для обеспечения удобного доступа к данным через стандартный SQL. Более мощные языки и библиотеки приложений могут использоваться для генерации SQL. Хранимые процедуры имеют тенденцию затенять природу данных и вносить ненужный уровень абстракции, сложности и обслуживания в систему.

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

3 голосов
/ 26 сентября 2008

У меня чуть меньше 200 в моем коммерческом продукте SQL Server 2005, который, вероятно, увеличится еще на 10-20 в следующие несколько дней для некоторых новых отчетов.

Там, где это возможно, я пишу «подпрограммы» sprocs, чтобы каждый раз, когда я обнаруживал, что собираю 3 или 4 одинаковых утверждения в более чем пару sprocs, пришло время превратить эти несколько утверждений в подпрограмму, если вы понимаете, что я имею в виду .

Я не склонен использовать sprocs для выполнения всей бизнес-логики как таковой, я просто предпочитаю, чтобы sprocs выполнял все, что можно было бы считать «транзакционным» - так, где мой клиентский код (в Delphi, но неважно) может сделать нечетную вставку или обновить себя, как только что-то потребует обновления или вставки нескольких вещей «сразу», пришло время для sproc.

У меня есть простое, грубое соглашение об именах, чтобы помочь в удобочитаемости (и в обслуживании!)

Кодовое название продукта 'Rachel', поэтому у нас есть

RP_whatever   - these are general sprocs that update/insert data, 
              - or return small result sets

RXP_whatever  - these are subroutine sprocs that server as 'functions' 
              - or workers to the RP_ type procs

REP_whatever  - these are sprocs that simply act as glorified views almost
              - they don't alter data, they return potentially complex result sets
              - for reporting purposes, etc

XX_whatever   - these are internal test/development/maintenance sprocs 
              - that the client application (or the local dba) would not normally use

наименование является произвольным, оно просто помогает отличить префикс sp_, используемый SQL Server.

Полагаю, если бы я обнаружил, что у меня в базе данных было 400-500 спроков, меня это может заинтересовать, но несколько сотен не проблема, если у вас есть система для определения того, за какую деятельность отвечает каждый спрок. за. Я предпочел бы отследить изменения схемы в нескольких сотнях шагов (где инструменты SQL Server могут помочь вам найти зависимости и т. Д.), Чем пытаться отследить изменения схемы в моем языке программирования высокого уровня.

3 голосов
/ 26 сентября 2008

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

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

3 голосов
/ 26 сентября 2008

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

3 голосов
/ 26 сентября 2008

Черт, да, их может быть слишком много. Пару лет назад я работал над системой, в которой было около 10 000 процедур. Это было безумно. Люди, которые писали систему, на самом деле не знали, как программировать, но они знали, как исправить плохо структурированные процессы, поэтому они включили почти всю логику приложения в процессы. Некоторые из проков бежали за тысячи строк. Управление беспорядком было кошмаром.

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

2 голосов
/ 26 сентября 2008

в базе данных Oracle вы можете использовать пакеты для группировки связанных процедур.

некоторые из них и ваше пространство имен освободятся.

2 голосов
/ 26 сентября 2008

Мой вопрос: почему вы не используете какую-то платформу промежуточного ПО, если говорите о сотнях или тысячах хранимых процедур?

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

2 голосов
/ 27 сентября 2008

Мне кажется, что использование большого количества хранимых процедур ведет вас к чему-то эквивалентному PHP API. Тысячи глобальных функций, которые могут не иметь ничего общего друг с другом, сгруппированы вместе. Единственный способ связать их между собой - это иметь какое-то соглашение об именах, в котором перед каждой функцией ставится префикс имени модуля, аналогично функциям mysql_ в PHP. Я думаю, что это очень трудно поддерживать, и очень трудно поддерживать постоянство всего. Я думаю, что хранимые процедуры хорошо работают для вещей, которые действительно должны иметь место на сервере. Хранимая процедура для простого запроса выбора или даже запроса выбора с объединением, вероятно, зашла далеко. Используйте хранимые процедуры только в тех случаях, когда вам требуется обработка расширенной логики на сервере базы данных.

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