Повышение производительности до большого предложения if в функции SQL Server - PullRequest
2 голосов
/ 16 марта 2010

Я поддерживаю функцию в SQL Server 2005, которая на основе целочисленного входного параметра должна вызывать различные функции, например,

IF @rule_id = 1
   -- execute function 1
ELSE IF @rule_id = 2
   -- execute function 2
ELSE IF @rule_id = 3
   ... etc

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

Ответы [ 3 ]

3 голосов
/ 16 марта 2010

Я бы предложил вам сгенерировать код программно, например. через XML + XSLT. полученный T-SQL будет таким же, как и сейчас, но поддерживать его будет намного проще (добавление / удаление функций).

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

2 голосов
/ 16 марта 2010

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

например:

set @functionCall = 'functionRootName' + @rule_id
exec @functionCall
0 голосов
/ 16 марта 2010

Что бы ни вызывало функцию SQL - почему она не выбирает функцию?

Это похоже на плохо подобранное распределение ответственности.

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