比较 SQL Server 语言扩展与 SQL CLR

适用于:SQL Server 2019 (15.x) 及更高版本

本文比较 SQL Server语言扩展和本机公共语言运行时 (CLR)。 它标识它们之间的主要差异,并帮助你决定要使用哪一个。

SQL Server 语言扩展是 SQL Server 的一项功能,用于执行外部代码。 可以使用扩展性框架在外部代码中使用关系数据。

使用本机公共语言运行时 (CLR),可以通过 .NET 语言实现 SQL Server 的某些功能。 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 用于上传用户代码,并定义其他对象(函数、进程、触发器 UDT、UDAggs)。 CREATE EXTERNAL LANGUAGEEXTERNAL LIBRARY 用于管理扩展和库。
库支持 通过程序集实现。 可以使用特定运行时的库(例如:R 或 Python 包、Java 库)。
支持的运行时 .NET Framework R、Python、Java、C# 或自带运行时 (BYOR)。
OSS 框架 N/A - 可以通过用户定义的 .NET 程序集进行扩展。 是 - 扩展 SDK 提供新扩展的创作或与运行时的集成,而无需更改引擎。
QO 集成 各种语法(包括并行度)的运算符级集成。 单个外部脚本运算符用于从运行时发送/接收结果和数据,此运算符支持批处理模式执行和并行。
资源治理 无 - 资源调控器外部的几个旋钮。 提供 EXTERNAL RESOURCE POOL 对象作为单独的机制来管理运行时/外部脚本使用的资源,除了 SQL 工作负载外,还可以为外部运行时定义策略。
权限模型 具有 db 范围对象的实例级控件。 具有 db 范围对象的实例级控件。
性能 由于执行的性质,SQL CLR 代码通常优于扩展性。 非常适合用于面向批处理的执行。
监视功能 sys.dm_clr* DMV 和有限的 SQL CLR 特定性能监视器计数器。 sys.dm_external* DMV、外部资源池 DMV、Windows JobObject 性能监视器计数器。

何时使用

使用语言扩展还是 CLR 取决于场景和目标。 例如,如果需要使用自己的聚合或类型扩展 T-SQL 外围应用,则 CLR 是最佳选择,因为不能使用扩展性机制定义类型或聚合。 另一方面,如果想要在组织或团队中运用现有数据科学专业知识,则使用具有扩展性的 R/Python 集成是最佳选择。

同样,性能目标也可能决定你的决策。 相比使用扩展性来调用执行正则表达式功能的 Python 脚本,在 C# 中实现相同正则表达式函数和使用 CLR 要快得多。