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 LANGUAGE 、EXTERNAL 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 スクリプトを呼び出すよりもはるかに高速です。