我有一个包含大约12000行的表challenge
。每个点连接到它周围的四个点,例如100连接到99 101 11和189.我尝试使用小规模表,它工作得很好,但随着我增加表的大小,查询变得指数级变慢,现在它甚至都不会完成。这是我的查询
SELECT level, origin, destination
FROM challenge
WHERE destination = 2500
START WITH origin = 1
CONNECT BY NOCYCLE PRIOR destination = origin;
非常感谢有关如何优化此查询的任何建议。
答案 0 :(得分:0)
所以你在数千个节点的4度图(矩形格子?)中找到从节点1到节点2500的每条路径。我希望它们会有很多。挑战是否只是要求你统计它们?因为我认为关键在于你必须通过数学来计算出有多少,而不是暴力计算。
例如,如果它是一个50x50矩形网格,节点1和节点2500位于相对的角落,则最小路径长度为100步。 100步的路径将有50个水平,50个垂直,它们可以按任何顺序排列。弄清楚有多少种方法可以排列50 H
和50 V
的字符串,你可能会发现它甚至是强大的Oracle会遇到一些问题。 (生成行,即。执行计算只需要大整数运算,一旦你告诉它公式,Oracle可能会很快完成。)
你的查询实际上比这更糟糕。它不仅要求最小长度路径。因此,它还将返回长度为102的所有路径,这些路径距离目的地的某个地方一步之遥。长度为104的路径需要2个后退步骤。以及访问几乎所有节点的长度为2498的路径!计算这些路径比计算短路径更复杂,因为你必须排除那些跨越自己的路径。