Open sourcing the .NET 5 C# Language Extension for SQL Server で発表がありましたが、SQL Server 2019 から使用することができるようになった Language Extension で .NET 5 C# が使用できるようになりました。
今回のアナウンスは、次のアナウンスの続きにあたるものになるのではないでしょうか。
- Open sourcing the Java language extension for SQL Server
- Open sourcing the R and Python language extensions for SQL Server
SQL Server では、このような機能を使用したデータ分析を Advanced Analytics と呼ぶこともありますが、機能を活用することで、標準の T-SQL では難しい分析を行うことが可能となります。
今回の C# の発表を読みながら、この領域の情報をまとめてみたいと思います。
使用方法のステップバイステップについては GitHub のコンテンツを参照すると実際に試すことができます。
Contents
SQL Server Language Extension (SQL Server 言語拡張)
SQL Server では、2016 で、SQL Server 内で R を動作させる R Service がリリースされ、2017 で R 以外に Python を動作させることができるようになり、R Service から Machine Learning Service (ML Service) と名称が変更されました。
SQL Server 2019 では、ML Service でサポートされる言語として、Java が追加されたのですが、Java を実行させる方式としては、SQL Server 言語拡張 (Language Extension) という方式が用いられています。
従来までの R / Python については、ML Service の機能拡張フレームワークの中で実行が行われています。
実行時のプロセス間の通信については、アーキテクチャの図 に記載されており、実行が行われると BxlServer.exe が起動して処理が実行されているかと思います。
SQL Server 2019 でも標準搭載(SQL Server インストール時に ML Service の R / Python を有効化した場合) の R / Python を実行した場合は、このフローで実行されています。
Java については、SQL Server 言語拡張のフレームワークにより起動が行われているため使用されるプロセスが変わってきます。
Java についても アーキテクチャ図 が公開されています。
どちらも SQL Server から Lancupad プロセスが通信されており、Launchpad から Language Extension が起動されているのですが、SQL Server 言語拡張の場合は、「BxlServer.exe」ではなく、「ExtHost.exe」が起動されます。
Java を実行するために使用されていた言語拡張
Java を ML Service で使用する場合、ML Service を使用可能にする手順 のほかに、外部言語の作成 の手順を実行する必要がありました。
Java も言語拡張により実装が行われており、ML Service で R/Python 以外に使用可能な言語を拡張する場合は、CREATE EXTERNAL LANGUAGE で外部言語拡張を登録する必要があります。(ENVIRONMENT_VARIABLES の \ (パス区切り) は \\ と 2 個でエスケープする必要があります)
CREATE EXTERNAL LANGUAGE Java FROM (CONTENT = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\java-lang-extension.zip', FILE_NAME = 'javaextension.dll', ENVIRONMENT_VARIABLES = N'{"JRE_HOME":"C:\\Program Files\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\AZUL-OpenJDK-JRE"}' ); GO
SQL Server 2019 では ML Service をインストールすると、Java を実行するための言語拡張のモジュール一式と JRE が含まれていますので、それを使用するように設定をしています。(現在は、Zule の JRE ですが、そのうち Microsoft Open JDK の JRE になったりするんでしょうかね)
言語拡張の仕様については次のドキュメントになるのでしょうかね。
- SQL Server 用の機能拡張フレームワーク API
- SQL Server 用の Microsoft Extensibility SDK for Java
- Microsoft SQL Server Language Extensions
言語拡張の仕様に則った拡張を使用することで様々な言語を、このフレームワーク上で動作させることができ、R/Python/Java については、外部言語拡張のソースコードが Microsoft SQL Server Language Extensions で公開されています。
これを使用することで、インストールメディアに含まれているモジュール以外にカスタムランタイムとして、任意の R/Python/Java を登録することが可能となっています。(ML Service の R / Python をインストールせず、外部言語拡張の R / Python を追加することで、BxlServer.exe ではなく、ExHost.exe 経由で R / Python を動作させることが可能です)
.NET 5 C# Language Extension
今回、言語拡張を使用して .NET 5 (.NET Core) C# を動作させるための外部言語が 2021/9/12 時点では、Windows 限定ではありますが、オープンソースで公開されました。
使用方法については、Regex Sample に記載されており、Java のサンプルである正規表現を使用したサンプルが公開されています。
流れについては、チュートリアル通りとなりますが、最初に外部言語拡張として、C# を動作させるための言語拡張を追加します。
CREATE EXTERNAL LANGUAGE Dotnet FROM (CONTENT = N'<path>\dotnet-core-CSharp-lang-extension.zip', FILE_NAME = 'nativecsharpextension.dll' ); GO
次に、DLL を SQL Server 内にライブラリとして登録を行います。
CREATE EXTERNAL LIBRARY regex FROM (CONTENT = N'<path>\RegexSample.dll') WITH (LANGUAGE = 'Dotnet'); GO
これで、sp_execute_external_script 経由で、登録したライブラリを呼び出すことができるようになります。
declare @rowsCount int declare @regexExpr varchar(200) set @regexExpr = N'[Cc]#' EXEC sp_execute_external_script @language = N'Dotnet' , @script = N'regex;UserExecutor.CSharpRegexExecutor' , @input_data_1 = N'SELECT * FROM testdata' , @params = N'@regexExpr varchar(200) OUTPUT, @rowsCount int OUTPUT' , @regexExpr = @regexExpr OUTPUT , @rowsCount = @rowsCount OUTPUT with result sets ((id int, text varchar(100))); select @rowsCount as rowsCount, @regexExpr as message
SQL CLR との違い
SQL Server 内で、C# を実行する方法としては、従来から SQL Server の共通言語ランタイム統合 (SQL CLR) という方法が提供されています。
SQL CLR は、ユーザー定義関数 / ユーザー定義型 / ストアドプロシージャ / トリガーをサポートしており、SQL Server 内のオブジェクトとして作成を行い、T-SQL の拡張のような形で使用することができます。使用する C# は .NET Framework となります。
一方、言語拡張の C# については、sp_execute_external_script 経由での実行のみをサポートしており、T-SQL のクエリをインプットとして使用します。クエリの結果セットを渡し、その結果セットに対して新しい情報を付与するような形で利用します。使用する C# は .NET Core となります。
また、SQL CLR は SQL Server 内のプロセス内で実行され、言語拡張は Launchpad 経由で、ExtHost で実行されるというような実行方法の違いもありますので C# を SQL Server で実行するという機能ではありますが、実行方法の違いもあるかと。