今月、PASS Summit 2020 が開催されており、SQL Server ベースのデータベースエンジンに対して追加が予定されている、クエリストアヒント / Ledger という、2 つの機能の紹介が行われていました。
現在、最新バージョンの SQL Server は SQL Server 2019 CU8 ですが、このバージョンではこれらの機能の実装の片鱗を見ることはできません。
しかし、Azure SQL Database / Azure Arc Enabled SQL Managed Instance のクラウドベースの SQL Server のデータベースエンジンでは、これらの機能はまだ使用することはできないのですが、機能の実装が進んでいることが把握できる情報を確認することができるようになっています。
現在利用可能な SQL Server ベースの環境では、Azure Arc Enabled SQL Managed Instance (Azure Arc SQL MI)? が機能をより確認できそうですので、ざっくりと情報を見てみました。
新しいバージョンの SQL Server がリリースされた際に、以前のバージョンとの差分を確認するための方法として「リンクサーバー経由で以前のバージョンのシステムテーブルと比較を行う」という方法があります。
SELECT type_desc, name FROM sys.all_objects EXCEPT SELECT type_desc COLLATE SQL_Latin1_General_CP1_CI_AS, name COLLATE SQL_Latin1_General_CP1_CI_AS FROM [xxxxxx].[master].[sys].[all_objects] ORDER BY type_desc, name asc;
このようなクエリを実行して、オブジェクトの差を確認することで、新しく追加された機能の情報の確認を行います。
SQL Server 2019 CU8 と、Azure Arc MI のシステムオブジェクトを比較すると、現時点では 82 のシステムオブジェクトの差が確認できます。
いくつかのシステムオブジェクトは Azure SQL Edge で追加されたストリーム用のオブジェクトや、Serverless SQL pool で使用されている分散クエリエンジン (Polaris) 用の情報のようなのですが、それ以外のオブジェクトも追加されています。
この中には、PASS Summit で発表のあった、クエリストアヒントや Ledger についての情報も確認できます。
クエリストアヒントであれば「sys.query_store_query_hints」という DMV が追加されています。
Ledger は台帳という意味になるかと思いますが、この機能はセキュリティを向上させる機能となります。
この機能はシステムバージョニングの有効化と合わせて使用するような機能で、次のような形でテーブル単位で有効にするようです。
create table part ( id int not null primary key clustered, serialnumber vharchar(100) not null, manufactureingdate datetime2 not null, batchid int not null, carid int null ) with(system_versioning = on, LEDGER=ON)
これにより、行の変更についての管理が厳密に行われるようになるようで、DBCC PAGE のような強制的に行の情報の変更を行った場合でも、行のアクセス時には、LEDGER によって取得されているハッシュの情報と比較が行われ、不正な変更が発生している場合でもそれを検知することができるようになるようです。
先ほどのオブジェクトの比較でも「sys.db_ledger_blocks」や「sys.db_ledger_transactions」というようなオブジェクトが追加される予定であることが確認できますね。
先ほどはオブジェクトの比較で実施しましたが、列の差分を出すというアプローチも有益です。
SELECT OBJECT_NAME(object_id) AS object_name, name FROM sys.all_columns EXCEPT SELECT OBJECT_NAME(object_id) COLLATE SQL_Latin1_General_CP1_CI_AS AS object_name , name COLLATE SQL_Latin1_General_CP1_CI_AS FROM [xxxxxxx].[master].[sys].all_columns ORDER BY object_name ASC, name asc;
これにより、新しく追加されたオブジェクトの情報だけでなく、追加されたオブジェクトの情報を確認することができます。
SQL Server 2019 でも参照可能な「sys.query_store_runtime_stats」であれば、page_server_io_reads という項目が追加されていることが確認できます。
これは、Hyperscale のページサーバーの参照状況を示したものとなります。
今回、比較に使用している Azure Arc enabled SQL MI はクラウドベースのデータベースエンジンですので、このような SQL Database 向けに追加されている情報が確認できるようです。
sys.tables であれば、Azure SQL Edge 向けのリテンションの情報に以外にも Ledger についての情報が追加されていることが確認できますね。
実際に sys.tables を検索してみると次のように情報を確認することができます。
台帳化したテーブルかどうかを管理する項目が追加されていますね。
このような比較を行うことで、次のデータベースエンジンではどのような機能の追加が行われるのかを確認することができます。
sys.databases についても面白い情報が確認できます。
次の画像は、Azure Arc Enabled SQL MI で取得した情報なのですが、互換性レベル 160 が設定されているデータベースが確認できますね。
現在、SQL Server 2019 で利用可能なデータベースの互換性レベルは 150 までとなっており、Azure SQL DB でもこれは同様です。
しかし、Azure Arc Enabled SQL MI では、互換性レベル 160 が設定できるようになっており、次の互換性レベルの存在を確認することが、既にできます。
sys.configurations や、sys.database_scoped_configurations を比較することで、新しいオプションの設定を確認することもできます。
Azure Arc Enabled SQL MI は、オンプレミスに配置可能な SQL Server ですが、利用形態はクラウドを意識したものとなっていますので、Box 型 (セルフインストールタイプの製品 の SQL Server) の SQL Server のリリースを待つことなく、新しい機能を含むバージョンにバージョンアップすることができるようになっています。
現時点でも、自由に操作できる SQL Server ではあるが、Box の SQL Server には含まれていない最新の機能の情報を確認できるようになっていますので、最新環境をオンプレミスで利用できる環境としては、結構面白いものがありそうですね。