0

サブコールがある可能性のあるコールを監視する監視アプリケーションがあります。したがって、監視データを読み取りたい場合は、サブコールを含むコールのリストを取得したいと思います。呼び出しは無期限にネストされる可能性があります。

-編集
の開始現在のテストテーブルには、約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句がありました。しかし、私のテストでは、これらがパフォーマンスの問題の原因ではないことが示されました。(編集終了)。

  1. 両親を読む:

    SELECT am.messageId montest2 am(am.sessionIDはnullではありません)最初の5行のみ

  2. 子供を読む:

    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行をフェッチ)構文を変更することを意味します。

4

2 に答える 2

1

私は今、次のように問題を解決しました:

すべてのエントリを含む単一のテーブルを2つのテーブルに分割しました。1つのテーブルにはツリーのすべてのルートエントリが含まれ、もう1つのテーブルにはすべての子(および子の子など)が含まれます。
したがって、最初のクエリはルートテーブルに対して実行され、2番目のクエリは子に対して実行されます。子テーブルのサイズは現在約4分の1であるため、クエリははるかに高速です。
また、インデックスの1つが間違って定義されているため、実行されないことに気付きました。これは、db2ツールを使用してdb2データベースで問題を試したときに説明することでわかりました。

ですから、そこにいるすべての人への私のヒント:テーブルを小さくし、説明を使用して、インデックスが想定どおりに機能しているかどうかを確認します。

于 2012-05-31T07:57:58.120 に答える
0

結合をwhere句に移動してみませんか?これがより良いかどうかを確認してください。

SELECT messageId 
FROM montest2
WHERE rootID in (
         SELECT rootID from montest2 
         WHERE sessionID IS NOT null 
         FIRST 5 ROWS ONLY ) AND 
      sessionID IS NOT null
于 2012-05-21T11:53:44.797 に答える