SQL Server 言語拡張機能と SQL CLR を比較する

適用対象: SQL Server 2019 (15.x) 以降のバージョン

この記事では、SQL Server 言語拡張機能とネイティブの共通言語ランタイム (CLR) を比較します。 それらの間の主な違いを識別すると、どちらを使用するか決定するのに役立ちます。

SQL Server 言語拡張機能は、外部コードの実行に使用される SQL Server の機能です。 リレーショナル データは、機能拡張フレームワークを使用して外部コードで使用できます。

ネイティブの共通言語ランタイム (CLR) を使用すると、.NET 言語を使用して SQL Server 機能の一部を実装できます。 CLR では、言語間の統合、コード アクセス セキュリティ、オブジェクトの有効期間の管理、デバッグとプロファイルのサポートなどのサービスがマネージド コードに提供されます。

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 のサポート ユーザー コードをアップロードし、他のオブジェクト (関数、プロシージャ、トリガー UDT、UDAgg) を定義するためのCREATE ASSEMBLY CREATE EXTERNAL LANGUAGEEXTERNAL LIBRARY は拡張機能とライブラリを管理します。
ライブラリのサポート アセンブリを介して実現されます。 特定のランタイム用のライブラリを使用できます (例: R または Python パッケージ、Java ライブラリ)。
サポートされるランタイム .NET Framework R、Python、Java、C#、または Bring Your Own Runtime (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 ジョブ オブジェクト パフォーマンス モニター カウンター。

それぞれをいつ使用するか

言語拡張と CLR のどちらを使用するかは、シナリオと目標によって決まります。 たとえば、独自の集計または型を使用して T-SQL の表面積を拡張する必要がある場合は、拡張メカニズムを使用して型または集計を定義できないため、CLR が最適な選択です。 一方、組織やチームで既存のデータ サイエンスの専門知識を使用したい場合は、拡張性を備えた R/Python 統合を使用することが最良の選択です。

同様に、パフォーマンス目標によって決定が決まる場合があります。 C# で正規表現関数を実装し、CLR を使用する方が、拡張性を使用して同じ正規表現機能を実行する Python スクリプトを呼び出すよりもはるかに高速です。