Вызов хранимой процедуры T-SQL из хранимой процедуры CLR - PullRequest
4 голосов
/ 18 декабря 2011

Очень краткая справка: мы используем хранимые процедуры CLR для применения контроля доступа, используя Active Directory, к результатам запроса, чтобы ограничить то, что конечный пользователь может соответственно видеть.В двух словах, это делается путем удаления строк из таблицы данных, где пользователь не удовлетворяет критериям доступа к результату (в данном случае документ).

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

Мне интересно, есть ли какой-то выигрыш в производительности от вызова оригинальной обычной хранимой процедуры T-SQLиз эквивалента хранимой процедуры CLR вместо передачи встроенного T-SQL в объект команды (который в данном случае является просто исходным T-SQL, который был сделан хранимой процедурой)?Я не могу найти где-нибудь, где кто-то упомянул об этом (отчасти, вероятно, потому что это было бы очень запутанным как пример SP CLR, я думаю :-)).Мне кажется, что вы могли бы, так как хранимый процесс T-SQL уже был оптимизирован и скомпилирован?

Кто-нибудь может подтвердить это для меня?

Надеюсь, я был достаточно ясен.Большое спасибо,

Колм.

1 Ответ

0 голосов
/ 18 декабря 2011

Если ваша хранимая процедура SQL CLR правильно выполняет определенный запрос (хорошо параметризован) и выполняет его довольно часто, то этот запрос T-SQL будет просто один раз проходить через всю последовательность «определения оптимального плана выполнения», а затем сохраняться вкэш плана вашего SQL Server (и не удаляется из него быстрее, чем аналогичная хранимая процедура T-SQL).

Таким образом, он будет так же «предварительно скомпилирован», как и ваш исходный T-SQLхранимая процедура.С этой точки зрения я не вижу никакой пользы.

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

...