Какие хорошие проблемы нужно решить с помощью хранимых процедур CLR? - PullRequest
16 голосов
/ 26 января 2010

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

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

Например, я обнаружил, что хранимые процедуры CLR + SSRS - отличный способ манипулировать даннымилогика из SSRS и из T-SQL, а также в управляемый код, который легче читать и манипулировать.

Ответы [ 6 ]

23 голосов
/ 26 января 2010

Многие проблемы, требующие денормализации и / или последовательных операций, могут быть исключительно хорошо обработаны CLR и могут быть использованы для значительного повышения производительности без ущерба для удобства использования на стороне SQL (много). Вместо того, чтобы полностью полагаться на основанные на множестве или итеративные операции, вы можете использовать гибридный подход, использовать основанное на множестве решение для больших выборок и переключиться на итерационную модель для узких циклов.

Встроенные hierarchyid и геопространственные (то есть geography) типы в SQL Server 2008 являются хорошими примерами проблемы денормализации. Оба содержат (почти) произвольно большой объем данных, которые трудно нормализовать без ущерба для производительности - вам потребуется использовать рекурсию или курсоры, чтобы выполнить с ними какую-либо значимую работу иначе, или использовать крысиное гнездо триггеров и / или запланированных задач вести таблицу денормализации.

Другая проблема, которую я решил с типами CLR, - встроенное сжатие. Это может звучать как бессмысленное или академическое упражнение, но когда ваши полностью нормализованные данные помещаются в терабайты, сокращение размера на 80-90% значит много. В SQL теперь есть свое собственное встроенное сжатие, а в SQL 2005 был vardecimal, и это тоже хорошие инструменты, но алгоритм «минимизации» с учетом предметной области может быть в несколько раз более эффективным с точки зрения как загрузки процессора, так и степени сжатия. Очевидно, что это относится не к каждой проблеме, но к некоторым.

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

Последнее в моем списке: пользовательские потоковые агрегаты также очень полезны, особенно для всего, что связано со статистикой. Есть некоторые вещи, которые вы просто не можете составить из встроенных агрегатов SQL, такие как медианы, взвешенные скользящие средние и т. Д. UDA также могут принимать несколько аргументов, чтобы вы могли их параметризировать; технически агрегат не гарантирует получение данных в каком-либо определенном порядке в текущей версии SQL Server, но вы можете обойти это ограничение, передав ему ROW_NUMBER в качестве дополнительного аргумента и использовать его для реализации практически любой оконной функции (пусть агрегат выплюнет UDT, который затем может быть преобразован в таблицу).

На самом деле очень обидно, как мало примеров действительно полезных приложений SQL-CLR; Выполните поиск в Google, и вы получите 10 миллионов результатов, каждый из которых требует какой-то глупой конкатенации строк или регулярных выражений. Они полезны, но потратьте несколько минут, чтобы узнать, в частности, о пользовательских UDT и UDA SQL, и вы увидите множество вариантов их использования в ваших собственных приложениях. Конечно, не сходите с ума - подумайте о том, есть ли лучшее решение в чистом SQL, - но не стоит их сбрасывать со счетов.

5 голосов
/ 26 января 2010

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

5 голосов
/ 26 января 2010

Манипулирование строками - поиск по регулярному выражению является классическим. Очень легко выставить в CLR, очень сложно сделать в прямом T-SQL.

См. эту ссылку для получения подробной информации о реализации и микро-эталоне (SQLCLR is only 47 milliseconds compared to 6.187 seconds for the T-SQL UDF).

3 голосов
/ 27 января 2010

Вот пример чего-то, что я использовал CLR Procs для того, что я думал, было аккуратно:

Обновление данных по времени от внешних веб-сервисов с использованием хранимых процедур CLR и заданий SQL.

У нас есть приложение, которое синхронизирует некоторые данные, которые оно отслеживает, с внешними отраслевыми потоками данных. Синхронизация выполняется еженедельно для всего и по требованию для отдельных обновлений, поэтому у меня был существующий API веб-сервиса для доступа к нему. Вещи уже запланированы службой Windows, но я подумал, почему бы не быть в состоянии запланировать их, как наши другие задания SQL?

Я создал хранимую процедуру CLR, которая ссылается на API веб-сервиса приложения. Затем я добавил несколько параметров для @RecordID для поддержки одиночной синхронизации и запланировал это в заданиях SQL диспетчера Enterprise.

Теперь я могу использовать задание для запуска дБ-синхронизации или использовать процедуру в других SQL-процессах или триггерах для обновления данных из внешнего канала.

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

2 голосов
/ 26 января 2010
  • Пользовательские агрегаты
  • Струнные манипуляции
  • Пользовательские типы данных

Если честно, я вижу только обработку строк, которая включает разбиение CSV на строки.

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

Из MSDN с примерами RegEx и RSS: Использование интеграции CLR в SQL Server 2005

1 голос
/ 29 января 2013

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

У нас есть базовое приложение, построенное на старой платформе MUMPS, работающее на базе данных Intersystems Cache. Данные являются иерархическими, не реляционными по своей природе. Основной глобальный массив (то есть таблица) имеет несколько уровней данных и элементы, все сгруппированные по номеру счета. Сканирование даже одного столбца требует загрузки всего глобального с диска, и это занимает более 8 часов. Поставщик действительно предоставляет драйвер ODBC и сопоставления глобальным переменным, но это часто приводит к сканированию и чрезвычайно медленным запросам.

Я создал табличную функцию, которая принимает программу ObjectScript (межсистемный диалект MUMPS), выполняет ее на сервере Cache и возвращает выходные строки в виде строк данных. Я могу микроуправлять путем доступа к данным на стороне MUMPS (это действительно то, что нужно для получения эффективного доступа к данным), предоставляя конкретную программу для выполнения на этой стороне, а затем легко импортировать данные в MSSQL как специальный встроенный источник данных.

Я могу использовать TVF для управления выбором данных или использовать CROSS APPLY для поиска на другом конце, и это достаточно эффективно. Я даже могу запустить несколько запросов на удаленном конце параллельно, если я заставлю MSSQL использовать план параллельного выполнения.

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