1

我有一个challenge包含大约 12000 行的表。每个点都连接到它周围的四个点,例如 100 连接到 99 101 11 和 189。我用一个小规模的表进行了尝试,它工作得很好,但是随着我增加表的大小,查询变得成倍地变慢,现在它甚至不会完成。这是我的查询

SELECT level, origin, destination
FROM challenge 
WHERE destination = 2500
START WITH origin = 1
CONNECT BY NOCYCLE  PRIOR destination = origin;

任何有关如何优化此查询的建议将不胜感激。

4

1 回答 1

0

因此,您在数千个节点的 4 度图(矩形格?)中找到从节点 1 到节点 2500 的每条路径。我预计会有很多。挑战只是要求你数一数吗?因为我认为重点是你必须通过数学计算出有多少,而不是蛮力计算。

例如,如果它是一个 50x50 的矩形网格,节点 1 和节点 2500 在对角,则最小路径长度为 100 步。一条 100 步的路径将有 50 个水平和 50 个垂直,它们可以以任何顺序出现。弄清楚有多少种方法可以排列一串 50H和 50 V,您可能会发现即使是强大的 Oracle 也会遇到一些问题。(也就是说,生成行。计算只需要大整数运算,一旦你告诉它公式,Oracle 可能会很快完成。)

而您的查询实际上比这更糟糕。它不仅要求最小长度的路径。因此,它还将返回所有长度为 102 的路径,这些路径在沿途某处远离目的地。长度为 104 的路径向后退了 2 步。以及访问几乎所有节点的长度为 2498 的路径!计算这些路径比计算短路径更复杂,因为您必须排除那些交叉的路径。

于 2013-07-18T18:21:16.007 回答