H2查询中的无限循环
Infinite loop in H2 query
我正在 H2 database through a test ran using JUnit 上执行以下查询,在 table 上有 3 个条目:
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;
查询在包含人员的自引用 table 上执行。它会找到一个人所有祖先的 ID。
由于某种原因,这运行了我猜想的无限循环,因为测试挂起,我可以看到 RAM 使用率快速上升 (>2GB)。 为什么会发生这种情况,我该如何解决?
观察:
- 这在 Oracle 中执行得很好
- 如果 table 中没有指定 PARENT_ID 它执行正常,但如果有,它会挂起并且 RAM 使用量不断增加。
所以问题与您的第二个 select 声明有关,该声明需要与 CTE acenstors table
所以根据我的查询,它正在做的是
1) 因此第一个查询将添加起始节点并执行一次。例如ID="John",Parent_ID="Rob"
2) 将执行多次的第二个查询将查找 ID="Rob" 的人,因为我们要加入 "ON P1.PARENT_ID = P2.ID"。例如)这将添加 [ID="ROB"、Parent_ID="Susan"] 和 ID="ROB"、Parent_ID="Paul"]
3) 在后台,它会再次执行步骤 2,这次它会查找名为 Susan 和 Paul 的人并将其添加到祖先 table。这样做直到 returns 没有更多记录。
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;
我正在 H2 database through a test ran using JUnit 上执行以下查询,在 table 上有 3 个条目:
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;
查询在包含人员的自引用 table 上执行。它会找到一个人所有祖先的 ID。
由于某种原因,这运行了我猜想的无限循环,因为测试挂起,我可以看到 RAM 使用率快速上升 (>2GB)。 为什么会发生这种情况,我该如何解决?
观察:
- 这在 Oracle 中执行得很好
- 如果 table 中没有指定 PARENT_ID 它执行正常,但如果有,它会挂起并且 RAM 使用量不断增加。
所以问题与您的第二个 select 声明有关,该声明需要与 CTE acenstors table
所以根据我的查询,它正在做的是
1) 因此第一个查询将添加起始节点并执行一次。例如ID="John",Parent_ID="Rob"
2) 将执行多次的第二个查询将查找 ID="Rob" 的人,因为我们要加入 "ON P1.PARENT_ID = P2.ID"。例如)这将添加 [ID="ROB"、Parent_ID="Susan"] 和 ID="ROB"、Parent_ID="Paul"]
3) 在后台,它会再次执行步骤 2,这次它会查找名为 Susan 和 Paul 的人并将其添加到祖先 table。这样做直到 returns 没有更多记录。
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;