метапрограммирование с помощью хранимых процедур? - PullRequest
3 голосов
/ 05 августа 2009

Это будет как прямой вопрос, так и предмет обсуждения. Сначала я задам прямой вопрос:

Может ли хранимая процедура динамически создавать другую хранимую процедуру? (Лично меня интересует SQL Server 2008, но в интересах более широкого обсуждения он останется открытым)

Теперь по причине, которую я спрашиваю. Вкратце (вы можете прочитать больше в другом месте), определяемые пользователем скалярные функции в SQL Server, в лучшем случае, являются узкими местами производительности. Я видел использование в нашей базе кода, которые замедляют общий запрос в 3-4 раза, но из того, что я прочитал, локальное влияние S-UDF может быть 10x +

Тем не менее, UDF потенциально хороши для повышения уровней абстракции, сокращения множества утомительных шаблонов, централизации логических правил и т. Д. В большинстве случаев они сводятся к простым выражениям, которые могут быть легко расширены встроенными - но это не так ( Я действительно думаю только о незапрашивающих функциях - например, манипуляциях со строками). Я видел сообщение об ошибке, которое будет исправлено в следующем выпуске - с некоторым взносом от MS. Но пока мы должны жить с (ИМХО) неработающей реализацией.

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

Так что моей безумной идеей было сначала написать проки с директивами препроцессора C, а затем передать их через препроцессор перед отправкой в ​​RDBMS. Это может работать, но есть свои проблемы.

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

Однако, теперь я объяснил свой путь к вопросу, я также хотел бы оставить его открытым для других идей. Я уверен, что я не единственный, кто думал в этом направлении. Возможно, уже есть сторонние решения? Мой поиск в Google еще не много. Также я подумал, что это будет веселая тема для обсуждения.

[править]

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

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

1 Ответ

0 голосов
/ 05 августа 2009

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

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

...