サブコールがある可能性のあるコールを監視する監視アプリケーションがあります。したがって、監視データを読み取りたい場合は、サブコールを含むコールのリストを取得したいと思います。呼び出しは無期限にネストされる可能性があります。
-編集
の開始現在のテストテーブルには、約700万のエントリがあります。生産的な使用法では、2倍のサイズになる可能性があります。ルートエントリごとに期待される子は0から約15であり、ごくまれに約50の子が存在する可能性があります。階層レベルは非常に低く、最大は約5レベルです。
以下は、私のデータモデルでこれらのエントリの限られた量を読み取る私のアプローチです。データモデルやクエリを改善するための提案があれば、ぜひお知らせください。
編集の終わり--
基本的に、私が見つけたすべてのフォーラムエントリは、複数のツリーではなく、1つのツリーからの読み取りを最適化することに関するものです。
現在、このようなテーブルは1つしかありません。
create TABLE montest2
(
rootId VARCHAR(45) NOT NULL,
messageId VARCHAR(45) NOT NULL,
requestMessageId VARCHAR(45),
sessionId VARCHAR(45),
PRIMARY KEY (messageID)
);
rootIdは、1つのツリーに属するすべての呼び出しで同じです。sessionIdに値がある場合、それがトップレベル(ルート)呼び出しであることがわかります。messageIdは、各呼び出しに固有です。requestMessageIdには、親のmessageIdが含まれます。
ここで、子を含む最初の5つのルート呼び出しを読みたいと思います。私はこれらのステートメントを使用してこれを行うことができます:
編集:問題をこのクエリに絞り込んだことに注意してください。別の親を選択できるように、親を読み取るための追加のWHERE句がありました。しかし、私のテストでは、これらがパフォーマンスの問題の原因ではないことが示されました。(編集終了)。
両親を読む:
SELECT am.messageId montest2 am(am.sessionIDはnullではありません)最初の5行のみ
子供を読む:
SELECT ac.messageId FROM montest2 ac INNER JOIN(SELECT am.rootID FROM montest2 am WHERE(am.sessionID IS NOT null)FETCH FIRST 5 ROWS ONLY)parents ON ac.rootID = parents.rootID WHERE(ac.sessionID IS NULL);
私は、2番目のステートメントが多くのエントリに対して高速ではないことを知っています。このクエリを最適化する方法について誰かにアドバイスをいただけますか?または、データモデルについて何を変更する必要がありますか?
PS:Derbyをデータベースとして使用していますが、どのデータベースでも機能するはずです。これは、制限(最初のx行をフェッチ)構文を変更することを意味します。