比較 SQL Server 語言延伸模組與 SQL CLR
適用於:SQL Server 2019 (15.x) 和更新版本
本文會比較 SQL Server 語言延伸模組與原生通用語言執行平台 (CLR)。 其中指出這兩者的主要差異,並協助您決定要使用哪一個。
SQL Server 語言延伸模組是 SQL Server 的一項功能,可用於執行外部程式碼。 藉由使用擴充性架構,即可在外部程式碼中使用關聯式資料。
原生通用語言執行平台 (CLR) 可讓您使用 .NET 語言實作 SQL Server 的某些功能。 CLR 提供含有如跨語言整合、程式碼存取安全性、物件存留期間管理,以及偵錯和設定檔作業支援的 Managed 程式碼。
SQL Server 語言延伸模組中可用的語言不等於直接取代 SQL CLR。 擴充性架構和語言延伸模組可擴充 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、UDAgg)。 |
CREATE EXTERNAL LANGUAGE ,EXTERNAL LIBRARY 用於管理延伸項目和程式庫。 |
程式庫支援 | 透過組件達成。 | 可使用特定執行階段的程式庫 (例如:R 或 Python 封裝、Java 程式庫)。 |
支援的執行階段 | .NET Framework | R、Python、Java、C# 或自備執行階段 (BYOR)。 |
OSS 架構 | 無 - 可透過使用者定義的 .NET 組件來擴充。 | 有 - 延伸模組 SDK 可讓您製作新的延伸模組,或與執行階段整合,而不需要變更引擎。 |
QO 整合 | 各種語法的運算子層級整合,包括平行處理原則。 | 單一外部指令碼運算子,用於從執行階段傳送/接收結果和資料,此運算子支援批次模式執行和平行處理原則。 |
資源控管 | 無 - Resource Governor 外部的幾個旋鈕。 | 提供 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 整合是最佳選擇。
同樣地,您的決策可能取決於效能目標。 在 C# 中實作 RegEx 函數並使用 CLR,會比使用擴充性叫用 Python 指令碼以執行相同 RegEx 功能更快。