Подтвердить что ты не робот

У вас слишком много хранимых процедур?

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

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

4b9b3361

Ответ 1

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

По возможности я пишу 'sproutine' 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 sprocs в базе данных, я мог бы заинтересоваться, но несколько сотен - это не проблема вообще, если у вас есть система для определения того, какой вид деятельности отвечает каждый sproc для. Я предпочел бы преследовать изменения схемы в нескольких сотнях sprocs (где инструменты SQL Server могут помочь вам найти зависимости и т.д.), Чем пытаться превзойти изменения схемы на моем языке программирования высокого уровня.

Ответ 10

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

Возможно, ваши сообщения sprocs должны быть usp_reporting_, а ваши бизнес-объекты должны быть usp_bussiness_ и т.д. Как долго вы можете управлять ими, не должно быть проблем с их большим количеством.

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

Ответ 11

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

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

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

Ответ 12

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

Невозможно говорить для других СУБД, но приложение Oracle, использующее PL/SQL, должно логически связывать процедуры и функции в пакетах, чтобы предотвратить каскадные недействительности и лучше управлять кодом.

Ответ 13

Да, у вас может быть много хранимых процедур.

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

Было бы легко найти пару следующих, не имея стандартного соглашения об именах... usp_GetCustomersOrder, CustomerOrderGet_sp, GetOrdersByCustomer_sp, spOrderDetailFetch, GetCustOrderInfo и т.д.

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

Джефф

Ответ 14

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

Ответ 15

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

Ответ 16

Я думаю, что до тех пор, пока вы назовете их uspXXX, а не spXXX, поиск по имени будет прямым, поэтому не будет недостатка - хотя вы можете задаться вопросом об обобщении procs, если у вас есть тысячи...

Ответ 17

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

Ответ 18

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

Ваш звонок!:)

Ответ 19

Мой первый крупный проект был разработан с помощью Object Relational Mapper, который абстрагировал базу данных, поэтому мы сделали все объектно-ориентированное, и было легче проработать и исправить ошибки, и было очень легко внести изменения, поскольку все данные и бизнес-логика были С#, однако, когда дело доходило до сложных вещей, система чувствовала себя медленной, поэтому нам приходилось обойти эти вещи или перепроектировать проект, особенно когда ORM пришлось выполнять сложные объединения в базе данных.

Im теперь работает над другой компанией, у которой есть девиз "наши приложения - это просто интерфейсы базы данных", и у него есть свои преимущества и недостатки. У нас действительно быстрые приложения, поскольку все операции с данными выполняются на хранимых процедурах, в основном это используется SQL Server 2005, но когда дело доходит до внесения изменений или исправления для программного обеспечения, это сложнее, потому что вы должны изменить их, код С# и хранимые процедуры SQL, так что это похоже на работу дважды, вопреки тому, что я использовал ORM, у вас нет рефакторинга или строго типизированных объектов в sql, Management Studio и других инструментах много помогает, но обычно вы тратите больше времени на этот путь.

Поэтому я бы сказал, что это зависит от потребностей проекта, если вы не собираетесь хранить действительно сложные бизнес-данные, чем, может быть, вы даже можете вообще не использовать хранимые процедуры и использовать ORM, что упростит жизнь разработчиков. Если вас беспокоит производительность и необходимо сохранить все ресурсы, кроме использования хранимых процедур, конечно, количество зависит от архитектуры, которую вы создаете, поэтому для exmaple, если у вас всегда есть хранимые процедуры для операций CRUD, вам понадобится один для вложений, один для обновления, один для удаления, один для выбора и один для листинга, так как это наиболее распространенные операции, если у вас есть 100 бизнес-объектов, умножьте их на 4 и вы получите 400 хранимых процедур только для управления наиболее основными операции на ваших объектах, поэтому да, их может быть слишком много.