Сравнение расширений языка SQL Server и SQL CLR

Область применения: SQL Server 2019 (15.x) и более поздних версий

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

Расширения языка SQL Server — это возможность SQL Server, используемая для выполнения внешнего кода. Реляционные данные могут использоваться во внешнем коде с помощью платформы расширяемости.

Собственная общеязыковая среда выполнения (CLR) позволяет реализовать некоторые функциональные возможности SQL Server для языков .NET. Среда CLR предоставляет управляемому коду такие услуги, как межъязыковая интеграция, управление доступом для кода, управление временем существования объекта, а также поддержку отладки и профилирования.

Языки, доступные в расширениях языка SQL Server, не являются прямой заменой для СРЕДЫ CLR SQL. Платформа расширяемости и расширения языка увеличивают контактную зону SQL Server и предоставляют среду выполнения для более близких к ядру СУБД сред выполнения. Они также создают платформу с открытым исходным кодом, которая позволяет без изменений ядра подключать новые среды выполнения. Сейчас эта контактная зона ограничена системной хранимой процедурой sp_execute_external_script.

Ниже перечислены некоторые ключевые различия между расширениями языка SQL и SQL CLR.

Функция SQL CLR Расширения языка SQL
Поддержка платформы Windows и Linux — Linux поддерживает только SAFE сборки. Windows и Linux с полностью аналогичными функциональными возможностями.
Режим выполнения Внутрипроцессно Внепроцессно
Изоляция Код CLR выполняется в процессе обработчика; Администратор экземпляра должен доверять всем сборкам или коду. Среда выполнения работает за пределами процесса ядра. Дополнительная изоляция предоставляется контейнерами приложений в Windows или пространствами имен в Linux. Внешнее сетевое взаимодействие также отключено по умолчанию.
Декларативный синтаксис (T-SQL) Определяемые пользователем типы, определяемые пользователем агрегаты, функции, процедуры, триггеры. Использование только нерегламентированного выполнения sp_execute_external_script.
Поддержка DDL CREATE ASSEMBLY для отправки пользовательского кода и определения других объектов (функций, procs, триггеров UDTs, UDAggs). CREATE EXTERNAL LANGUAGE, EXTERNAL LIBRARY для управления расширениями и библиотеками.
Поддержка библиотек Достигается через сборки. Можно использовать библиотеки для конкретной среды выполнения (например, пакеты R или Python, библиотеки Java).
Поддерживаемые среды выполнения .NET Framework R, Python, Java, C# или собственная среда выполнения (BYOR).
Платформа OSS Недоступно, но можно расширять с помощью определяемых пользователем сборок .NET. Включено в пакет SDK для расширений, который поддерживает создание новых расширений и интеграцию со средами выполнения без внесения изменений в ядро.
Интеграция с QO Интеграция на уровне операторов для разного синтаксиса, включая параллелизм. Один внешний оператор скрипта для отправки результатов и данных в среды выполнения и получения их оттуда. Этот оператор поддерживает выполнение в пакетном режиме и параллелизм.
Управление ресурсами Нет, только несколько элементов за пределами регулятора ресурсов. Предоставляет EXTERNAL RESOURCE POOL объект в качестве отдельного механизма для управления ресурсами, используемыми средой выполнения или внешними скриптами, политики можно определить для внешних сред выполнения в дополнение к рабочей нагрузке SQL.
Модель разрешения Управление на уровне экземпляров с объектами в области базы данных. Управление на уровне экземпляров с объектами в области базы данных.
Производительность Код СРЕДЫ CLR SQL обычно опережает расширяемость из-за характера выполнения. Идеально подходит для пакетного выполнения.
Возможности мониторинга sys.dm_clr*Динамические административные представления и ограниченные счетчики Монитор производительности среды CLR ДЛЯ SQL. sys.dm_external*Динамические административные представления, динамические административные представления внешнего пула ресурсов, счетчики Монитор производительности Заданий Windows.

Сценарии использования обоих вариантов

Выбор между расширениями языка и CLR зависит от конкретных сценариев и целей. Например, если необходимо расширить область поверхности T-SQL с собственными агрегатами или типами, то среда CLR является лучшим выбором, так как тип или агрегат не может быть определен с помощью механизма расширяемости. С другой стороны, если вы хотите использовать существующий опыт обработки и анализа данных в вашей организации или команде, то интеграция R/Python с расширяемостью является лучшим выбором.

Аналогичным образом, ваши цели производительности могут определить ваше решение. Реализация функции regex в C# и использование среды CLR гораздо быстрее, чем использование расширяемости для вызова скрипта Python, выполняющего те же функции regex.