突然(但不幸的是,我不知道什麼時候「突然」發生,我知道它在過去的某個時間點運行良好)我的一個查詢開始花費7+秒而不是毫秒來執行。我有1個本地表和3個表通過數據庫鏈接訪問。 3個遠程表連接在一起,其中一個與我的本地表連接。Oracle LEADING提示 - 爲什麼這是必需的?
本地表的where子句只需要幾個毫秒來自行執行,並且只返回幾個(最多10或100個)記錄。這3個遠程表之間有數十萬甚至數百萬條記錄,如果我適當地加入它們,我會得到數十或數十萬條記錄。
我只與遠程表連接,以便我可以提取與本地表中的每條記錄相關的幾條數據。
然而,似乎發生的事情是Oracle首先將遠程表連接在一起,然後將我的本地表連接到最後的那個混亂。這總是一個壞主意,尤其是考慮到現在存在的數據集,所以我在查詢中添加了一條/*+ LEADING(local_tab remote_tab_1) */
提示,現在它返回毫秒數。
我比較瞭解釋計劃,並且它們幾乎完全相同,除了一個遠程表上的單個BUFFER SORT
。
我想知道什麼可能會導致Oracle以錯誤的方式處理這個問題?這是索引問題嗎?我應該尋找什麼?
你試過分析你的表('dbms_stats.gather_table_stats')嗎? –
+1,有趣 – DCookie