4

JUnitを使用して実行されたテストを通じて、3 つのエントリを持つテーブルでH2 データベースに対して次のクエリを実行しています。

WITH ancestors(ID, PARENT_ID) AS 
(
  SELECT ID, PARENT_ID FROM PEOPLE WHERE ID = <person_id>
    UNION ALL
  SELECT P1.ID, P1.PARENT_ID FROM PEOPLE P1, PEOPLE P2 WHERE P1.ID = P2.PARENT_ID
)
SELECT ID FROM ancestors;

クエリは、人を含む自己参照テーブルで実行されます。人のすべての先祖のIDを見つけます。

これは何らかの理由で、テストがハングし、RAM 使用量が急速に (>2GB) 急増することを確認できるため、無限ループであると私が推測するものを実行します。なぜこれが起こっているのですか、どうすれば修正できますか?

所見:

  • これはOracleで正常に実行されます
  • テーブルにPARENT_IDが指定されていない場合は正常に実行されますが、指定されている場合はハングし、RAM使用量が継続的に増加します。
4

1 に答える 1

2

したがって、問題はCTE acenstorsテーブルに関連する必要がある2番目のselectステートメントに関連しています

私のクエリに基づいて、それがしていることは

1) したがって、最初のクエリは開始ノードを追加し、1 回実行されます。たとえば、ID="ジョン"、Parent_ID="ロブ"

2) 何度も実行される 2 番目のクエリは、"ON P1.PARENT_ID = P2.ID" に参加しているため、人物 ID="Rob" を検索します。例) [ID="ROB", Parent_ID="Susan"] と ID="ROB", Parent_ID="Paul"] を追加します。

3) バックグラウンドで、ステップ 2 を再度実行し、今度は Susan と Paul という個人名を調べて先祖テーブルに追加します。これは、レコードが返されなくなるまで行われます。

WITH ancestors(ID, PARENT_ID) AS 
(
    --child
    SELECT 
        ID, 
        PARENT_ID 
    FROM PEOPLE 
    WHERE ID = <person_id>

    UNION ALL

    --get my lineage
    SELECT 
        P2.ID, 
        P2.PARENT_ID 
    FROM ancestors P1 
    INNER JOIN PEOPLE P2 
        ON P1.PARENT_ID = P2.ID
)
SELECT ID FROM ancestors;
于 2016-05-10T14:52:01.340 に答える