2016-12-09 2 views
0

Мне интересно, если лучше иметь много хранимых процедур или одну хранимую процедуру с несколькими ветвями if-else.Производительность многоинтерфейсной инструкции If в SQL (Sql Server 2008)

Я понимаю, что SQL Server создаст план выполнения, основанный на самом последнем выполнении хранимой процедуры, поэтому при следующем выполнении хранимой процедуры с другим параметром, который ведет к другому пути в инструкции IF, то другой план выполнения будет скомпилирован и кэширован.

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

if(@iso = 'Item1') 
begin 
    if(@type = 'A') 
    begin 
    end 
    if(@type = 'B') 
    begin 
    end 
    if(@type = 'C') 
    begin 
    end 
end 
if(@iso = 'Item2') 
begin 
    if(@type = 'A') 
    begin 
    end 
    if(@type = 'D') 
    begin 
    end 
end 
if(@iso = 'Item3') 
begin 
    if(@type = 'B') 
    begin 
    end 
    if(@type = 'E') 
    begin 
    end 
end 

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

+0

В чем цель сокращения количества хранимых процедур? Что вы получаете от этого? Это первое, что я хотел бы спросить. – mikeb

+0

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

+0

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

ответ

0

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

Если вы выполняете большую хранимую процедуру с несколькими параметрами, как описано выше, вам нужно будет принять меры предосторожности против проблем с параметрами нюхания и кэширования плохих планов. Вот хорошая статья Брент Озар, которая хорошо описывает проблему и что с ней делать. What is Parameter Sniffing?

+0

Спасибо за ответ. Существует одна единственная цель хранимой процедуры, чтобы получить кредитное значение. Однако у нас есть 5 разных регионов и 2-3 разных типа продукта для каждого региона, каждый из которых может иметь свою кредитную стоимость. Значения хранятся в разных таблицах в базе данных, поскольку исходные данные различаются между регионами. В идеале у нас будет хранилище данных, где все данные будут стерты и нормализованы, но это то, что нужно будет ждать в будущем. – TychoBrahe

+0

Похоже, что в этой ситуации я могу склониться к одной хранимой процедуре и динамически строить sql на основе входов, которые могут быть немного болезненными. Возможно, использовать некоторые функции CTE или таблицы? Возможно, мне придется изменить свой голос с новой информацией. Возможно, я склонен согласиться с вашим руководителем. Лучше иметь один источник (sproc), чтобы получить данные, чтобы ваши приложения решали, куда идти для данных. Лучший подход действительно зависит от ваших данных и вашей бизнес-логики. –

Смежные вопросы