2014-10-20 71 views
1

A SELECT查詢在我的存儲過程中需要3秒在查詢的表沒有索引時執行。 均爲,執行查詢時Toad編輯器以及調用存儲過程時都是如此。 解釋計劃顯示全表掃描完成。存儲過程不使用表上的可用索引(Oracle)

當添加一個索引,在蟾蜍編輯返回相同的查詢結果瞬間(只是幾毫秒)。 解釋計劃顯示使用索引。但是,即使存在索引,查詢在存儲過程中仍然需要3秒。它看起來像查詢在存儲過程中執行時使用全表掃描,儘管有索引可加快速度。 爲什麼?

我已嘗試索引不同列與不同的順序。在所有情況下,相同的結果仍然存在。

在存儲過程中,使用BULK COLLECT INTO收集查詢結果。這是否有所作爲? 另外,存儲過程位於包中。

查詢是一個非常簡單SELECT聲明,就像這樣:

SELECT MY_COL, COUNT (MY_COL) 
    /* this line is only in stored proc */ BULK COLLECT INTO mycollection 
    FROM MY_TABLE 
    WHERE ANOTHER_COL = '123' /* or ANOTHER_COL = filterval (which is type NUMBER) */ 
GROUP BY MY_COL 
ORDER BY MY_COL 
+0

** ** SHOW執行計劃後加入指數之前。要了解更多信息,請跟蹤會話併發布日誌詳細信息。 – 2014-10-20 08:55:13

+0

我已經很好地總結了執行計劃的結果。該問題不會從顯示詳細輸出或其他日誌詳細信息中獲得任何其他信息。無論如何,我已經解決了這個問題。也不需要大喊':)' – ADTC 2014-10-20 09:32:53

回答

1

沒有源代碼,我們只能猜測...

所以我懷疑這是因爲蟾蜍你得到的只是第一個500行(500是Toad中的默認緩衝區大小),但是在存儲過程中,您可以將所有行提取到集合中。所以提取大概需要3秒的時間。特別是如果我們的查詢有嵌套循環。

更新:它也可能是隱式類型轉換where條件

+0

不,即使在蟾蜍編輯器中,查詢也需要** 3秒**來執行沒有索引。它只是一個'SELECT'查詢,沒有循環和程序性的東西。 – ADTC 2014-10-20 08:22:58

+1

您能分享您的proc源代碼嗎?它也可能是隱式類型轉換,在條件... – Rusty 2014-10-20 08:26:05

+0

OMG YES!它**是**隱式類型轉換。當我將條件的過濾器值從字符串更改爲數字時,即使索引存在,查詢也開始在* Toad Editor中進行全表掃描。我已添加有問題的查詢,請更新您的答案,我可以接受!愚蠢的我,我沒有想到這一點。 – ADTC 2014-10-20 08:35:29