Babelfish for Aurora PostgreSQL でクライアントから TDS を使用した時に Performance Insights でどのような結果が得られるのかを確認してみた

2024.02.11

いわさです。

Bablfish for Aurora PostgreSQL を使うと、Microsoft SQL Server をデータベースに使用することが前提となっているアプリケーションを、コード変更を最小に Amazon Aurora で動作させることが場合があります。

先日こちらの検証をしている時に、Babelfish でも Performance Insights が使えるのかどうかが気になりました。
Babelfish への移行を評価しようとしているのですが、移行にあたってパフォーマンス上の問題が生じる可能性を考えていました。
その際に、調査のために Performance Insights を使用したいのですが、Babelfish 使用時でも分析が出来るのか確認したことがありませんでした。

Performance Insights というのは RDS 使用時にパフォーマンス上の問題を分析するために活用出来る Amazon RDS のマネージドな機能です。

RDS/Aurora の基本的な機能なので使えるだろうと予想はしているのですが、エンジンごとに挙動が違っているので確認する必要がありました。
また、使えたとして出力されるクエリ情報などは PostgreSQL 用に変換されており、クライアントアプリケーション側との関連付けが少し難しくなるような気もしていました。

本日は上記について検証を行ったので紹介します。

やってみた

次のように Aurora PostgreSQL を新規作成し、Babelfish と Performance Insights をどちらも有効化します。

なお、Aurora PostgreSQL のエンジンバージョンは先日使えるようになった最新の 16.1 を選択しています。

適当な組み込む関数を使ってみる

Microsoft SQL Server 独自の機能を使って、それが PostgreSQL のものに内部的に変換されたものが使われているかどうかを知る必要があります。
そのため、Babelfish の中でサポートされている T-SQL 組み込み関数を使ったクエリを発行してみることにしました。サポートされている組み込み関数は次のドキュメントから確認することが出来ます。

色々とあるのですが、今回はこの中からDATETRUNCを使います。なんでも良いのですが。
Babelfish 3.5 からサポートされるようになった関数です。

次のように第一引数で指定した精度で、第二引数の日時を切り詰めてくれる関数です。

1> select DATETRUNC(day, GETDATE()) from fuga;
2> go
datetrunc              
-----------------------
2024-02-10 00:00:00.000
2024-02-10 00:00:00.000
2024-02-10 00:00:00.000

(3 rows affected)
1> select DATETRUNC(week, GETDATE()) from fuga;
2> go
datetrunc              
-----------------------
2024-02-04 00:00:00.000
2024-02-04 00:00:00.000
2024-02-04 00:00:00.000

Performance Insights の確認結果

上記クエリを複数回同時に実行したかったのでスクリプトを作成して実行しました。

DECLARE @index INTEGER
SET @index = 0
WHILE @index < 100
BEGIN
    SET @index = @index + 1
    select DATETRUNC(week, GETDATE()) from fuga;
END

スクリプト実行後、すぐに Performance Insights のトップ SQL タブに該当クエリが出力されました。
Performance Insights 自体は通常どおり使うことが出来ました。

また、SQL ステートメントを見てみると次のように指定した TDS 上のクエリ内容がそのまま出力されていました。

上記以外にもいくつかの方言を試してみたのですが全て同じように、使用したまま出力されていました。

結果としては、Babelfish でも問題なくて Performance Insights は使えて、出力される SQL クエリは SQL クライアントから送信した T-SQL がそのまま出力されることがわかりました。

PostgreSQL 用にクエリが変換されて、アプリケーションコードの特定が難しくなるかもという予想をしていたのですが、組み込み関数などを含めてそのままクライアントから実行された内容で出力されるようです。

さいごに

本日は Babelfish for Aurora PostgreSQL でクライアントから TDS を使用した時に Performance Insights でどのような結果が得られるのかを確認してみました。

Babelfish 使用時にも問題なく Performance Insights が使えましたね。クライアント呼び出しとの関連付けもしやすそうで普通に活用出来そうです。