2013-07-18 59 views
1

我有一個包含大約12000行的表challenge。每個點都連接到它周圍的四個點,例如100個連接到99 101 11和189.我試着用一個小規模的表進行操作,它工作得很好,但隨着我增加了表的大小,查詢成指數地變慢,現在它甚至不會完成。這是我的查詢使用CONNECT BY Oracle 10極慢的查詢10

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

任何關於如何優化此查詢的建議將不勝感激。

+0

在'destination'上添加缺少的索引? – dasblinkenlight

+0

**您需要向我們展示表和索引定義。**診斷慢查詢需要全表和索引定義,而不僅僅是描述或釋義。也許你的表格定義不好。也許索引沒有正確創建。也許你沒有一個你認爲你做過的那個專欄的索引。沒有看到表和索引定義,我們不能說。如果你知道如何做一個'EXPLAIN'或者得到一個執行計劃,那就把結果也放在問題中。 –

回答

0

因此,您可以找到從節點1到節點2500的每個路徑,其中包含數千個節點的4度圖(矩形點陣?)。我預計會有相當多的人。挑戰是否讓你數數?因爲我認爲問題的關鍵是你必須弄清算算算出的數量,而不是蠻力計算。

例如,如果它是一個50x50的矩形網格,對角有節點1和節點2500,則最小路徑長度爲100步。一個100步的路徑將有50個水平線和50個垂直線,並且它們可以以任何順序來進行。找出有多少種方法可以排列50 H和50 V的字符串,並且您可能會發現這是一個數字,即使是強大的Oracle也會遇到一些問題。 (生成行,也就是說,進行計算只需要大整數算術,一旦告訴它公式,Oracle可能會很快做到這一點)。

而且您的查詢實際上比這更糟糕。它不會只詢問最小長度的路徑。因此,它還將返回距離目的地某個地方一步之遙的所有長度爲102的路徑。長度爲104的路徑需要2個後退步驟。長度爲2498的路徑幾乎可以訪問所有的節點!計算這些路徑比計算短路徑更復雜,因爲您必須排除那些交叉自己的路徑。

+0

是的,你是對的。它是一個非常大的網格模式或數千個節點,每個節點可以直接連接到它周圍的節點。只是使用數學的問題是,有很多特定的節點只能連接到某個側面,這就是爲什麼我試圖使用查詢。我希望它能夠返回最短路徑的起點,終點和級別。我對這個表的定義是:create table challenge(origin int,destination int); 在挑戰(原點)上創建索引challenge_origin; 爲挑戰創造公共同義詞挑戰; –

+0

這是一個迷宮求解器!在SQL中!那麼肯定是「用錯了工具來展示你的創造力」。無論如何,您的查詢的問題是,它發現**所有**路徑。添加'和rownum = 1'會使它在找到第一個時停止,但不能保證它是最短的。爲此,您需要廣度優先搜索,並且CONNECT BY是深度優先搜索。在oracle文檔中搜索「寬度優先」會產生以下結果:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm –