Когда писать длинную хранимую процедуру - PullRequest
7 голосов
/ 14 июня 2011

Существуют ли какие-либо рекомендации относительно того, когда следует и не следует писать длинную сложную хранимую процедуру длиной более 2000 строк?

В моем конкретном случае эта хранимая процедура содержит множество операторов if / then, case, goto и branching.Он работает путем построения запросов SQL в зависимости от входных данных и результатов запросов и использует оператор execute для запуска построенных запросов.Он может выполнять несколько построенных запросов за один вызов и использовать результаты этих запросов для создания других запросов для выполнения.

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

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

Итак, мой вопрос (ы): как мы решаем, когда и когда не писатьдолго хранимые процедуры?

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

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

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

Ответы [ 3 ]

6 голосов
/ 14 июня 2011

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

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

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

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

6 голосов
/ 14 июня 2011

Я не уверен, что когда-либо было бы неплохо написать 2000+ LOC для одной функции. Моя первоначальная реакция состоит в том, чтобы сказать, что ваш sproc должен быть разбит на более мелкие функции (табличные или скалярные, в зависимости от ситуации) и хранимые процедуры (для операций, не связанных с запросами). Однако это может быть просто перемещение LOC, а не упрощение фактической операции. К сожалению, без публикации исходного кода было бы сложно дать более конкретный совет.

0 голосов
/ 30 марта 2016

Если у вас все еще есть эта проблема, вы можете попробовать использовать CLR (Common Language Runtime Integration), который использует другой язык Microsoft, например C #, Visual Basic, для кодирования вашего решения.Это поможет с отладкой и сопровождением вашего кода.

...