SQL Server のバージョンアップや、クラウド移行 (SQL Database / Managed Instance への移行) を実施する際のアセスメントと移行を行うためのツールとして Data Migration Assistant (DMA) というツールが公開されています。
このツールでは、Data Migration Assistant を使用した SQL Server 移行評価の実行 の 評価するデータベースと拡張イベントトレースの追加 に記載されているように、拡張イベント (xEvent) をインプットとして、アドホッククエリのシンタックスエラーのチェックを行うことができるようになります。
この、拡張イベントを入力としたアドホッククエリのチェックですが、4/7 時点のドキュメントに書いている内容を実施しても拡張イベントを使用した処理が行われていないように見えました。
先週 MicrosoftR Data Migration Assistant v5.1 の公開が行われたようで、本日この内容を確認していたところ、次の記載がありました。
(最新バージョンを使用すると SQL Server 2019 を移行元として使用することもできるようになっています)
sql_batch_completed event for application / xevent trace assessments
拡張イベントを入力として使用する場合、「sql_batch_completed」をイベントとして取得しないといけないようです。
現状のドキュメントは「sql_batch_completed」ではなく「sql_statement_completed」を取得するようになっているのですよね…。
ということで、次のような拡張イベントを使用することで、DMA の入力として活用することができます。
CREATE EVENT SESSION [DatalayerSession] ON SERVER ADD EVENT sqlserver.sql_batch_completed( ACTION (sqlserver.sql_text,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id)) ADD TARGET package0.asynchronous_file_target(SET filename=N'C:\temp\Demos\DataLayerAppassess\DatalayerSession.xel') WITH (MAX_MEMORY=2048 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=3 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) go
SQL Server のバージョンアップを実施した際の互換性については、次のようなドキュメントで確認をすることができます。
SQL Server 2012 でサポートしている互換性レベルでは動作するが、SQL Server 2019 の最新の互換性レベルでは動作しないクエリとしては次のようなものがあります。
-- 互換性レベル 100 で動作しなくなるクエリ -- MERGE が予約されたキーワードになる SELECT LoginID, JobTitle AS MERGE FROM HumanResources.Employee GO -- 互換性レベル 120 で動作しなくなるクエリ -- 再帰 CTE で重複した列名を使用 WITH cte AS( SELECT 1 as level, C1 AS C2, C2 FROM(VALUES(1,2),(1,3), (3,1))T1(C1,C2) UNION ALL SELECT level+1, T1.C1, T1.C2 FROM(VALUES(1,2),(1,3), (3,1))T1(C1,C2) INNER JOIN cte ON cte.C2 = T1.C2 ) SELECT TOP 10 * from cte GO
このクエリを SQL Server 2012 の互換性レベル 90 で実行して取得した拡張イベントを、DMA の入力として使用してみると、次のようなアセスメント結果を取得することができます。
「sql_statement_completed」で拡張イベントを取得した場合は、上記のクエリの実行結果が拡張イベントに含まれていても、Syntax issue は発生しないのですが、「sql_batch_completed」で取得した場合は Syntax issue が確認できていましたので、ドキュメントに記載されているイベントでは、DMA の入力として必要となるイベントが取得できていないように見えました…。
(イベントが異なっているのではというプルリクを出してみましたので、ドキュメントに誤りがあるのであれば、そのうち修正されるかもしれません)
今までの、DMA はデータベース内のオブジェクトの内容を元に互換性のチェックを実施するため、アプリケーションからアドホックに実行されているクエリの互換性チェックを DMA で実施するのは難しかったのですが、拡張イベントを使用することによってチェックができると移行時に機械的に確認できる項目を改善することができます。
Syntax Issue は互換性レベル単位で厳密にチェックしているかは微妙なような気がますが (互換性レベル 90 では問題ないが 100 でエラーとなるクエリの Syntax issue が 90 でも出てしまっているので) 互換性に問題がありそうなクエリをツールベースでチェックできるのはうれしいですね。