[OutSystems]SQLやAggregateのSQLを開発時に確認する


SQL要素やAggregateを使ってEntity検索機能を作る際に、テストデータを使って検索結果のプレビューをすることができます。このプレビューした際に使われたSQLを確認することができます。

SQL要素のプレビュー時SQL

SQL要素をダブルクリックしてダイアログを開き、(必要ならTest Inputsに入力して)、TESTボタンをクリックします。すると、Executed SQLタブ内にSQLが表示されます。

Aggregateのプレビュー時SQL

Aggregateをダブルクリックして開き、プレビューが表示されるまで待ちます。
右下に表示されるAggregateのプロパティウィンドウ内にExecuted SQLプロパティが表示されます。

参照列のフィルタで不思議な現象

この機能を使ってプレビュー用SQLを確認しているとたまに不思議な記述が見つかります。
どうも、他Entityを参照する列(他のEntityIdentifier型の列)へのフィルタをすると、条件に「IS NOT NULL」が追加されるようです。

以下のようなDetail Entityを例に確認してみます。MasterId属性はMaster Entityを参照しています。このMasterId、Integer型の属性、Text型の属性それぞれにFilter条件を設定してExecuted SQLを確認。

@がついているのは、Local Variableの値を渡している部分です。MasterIdについてだけ、Local Variablerとの一致条件による検索の後に「AND ([ENDETAIL1].[MASTERID] IS NOT NULL)」という条件が追加されています。

SELECT TOP (32) [ENDETAIL1].[ID] o0, [ENDETAIL1].[MASTERID] o1, [ENDETAIL1].[DETAIL1INTEGER] o2, [ENDETAIL1].[DETAIL1TEXT] o3
FROM [ALQGU5013].DBO.[OSUSR_W8T_DETAIL1] [ENDETAIL1]
WHERE (([ENDETAIL1].[MASTERID] = @MasterId)
    AND ([ENDETAIL1].[MASTERID] IS NOT NULL))
    AND ([ENDETAIL1].[DETAIL1INTEGER] = @Detail1Integer)
    AND ([ENDETAIL1].[DETAIL1TEXT] = @Detail1Text)

ちょっと意味がわかっていないんですが、記録の為残しておきます。

運用中のSQL

実際にPublishしてサーバーで動作したときのSQLはこの方法では確認できないようです。
Service StudioでExecuted SQLを確認すると、実行時のSQLは、最適化がかかったものに変化するとのこと。

また、私の知る限りでは、SQLやAggregateに運用中に実際に実行された際のSQLをログ出力するような機能がありません。

よって、問題確認のためにSQLを見たいときは、DB側で実行されたSQLをトレースする機能を使うことになりますね。SQL ServerならSQL Profilerでしょうか。