我對Oracle 11數據庫有以下問題,雖然存在修復,但我想了解爲什麼它以這種方式進行反應。引起昂貴計劃的同義詞
我們有兩個模式:包含所有表,視圖,plsql,...的「dev」模式和包含dev對象同義詞的「app」模式,即語句不包含 模式名稱。
甲DEV-視圖引用表(select * from a a1 -> b -> a a2 union select * from c
) ,其中有其用於選擇共同列,即,選擇 謂詞推入表「一」(300K行)和「b」(90K行)通過單獨的 索引訪問進行選擇,從而產生非常高效的計劃。
dev-fun是一個確定性的並行函數,它只是簡單地執行一些字符串操作,而不需要進一步的數據庫訪問 。
視圖上的選擇是這樣的:select * from view where common-column = fun(string)
該工程對開發模式符合市場預期,但如果這是在應用架構執行, 計劃變得相對昂貴,即fun(string)
沒有被按下的結果, ,但是這些表是散列連接的,結果將被掃描以查找元素。
仍然在應用模式中,當我用函數結果替換fun(string)
時,計劃再次變得便宜了 。
爲了解決這個問題,我複製在應用架構,而不是經由 引用它的同義詞的視圖,但在視/表變化的情況下,這意味着缺陷的潛在來源,因爲我們 通常不檢查應用程序架構... 對函數的調用仍然通過同義詞,並且視圖被按原樣複製,也就是 訪問基礎表的同義詞......並且計劃與它是在開發模式上執行 。
除了在所有基礎表上有選擇授予之外,我還嘗試授予表上的「查詢重寫」,「引用」和視圖上的「引用」。此外,我已經嘗試了該函數的authid選項。我不得不承認,我還沒有檢查row-level security,但我們沒有使用它們。
我還能檢查什麼?
oracle版本是11.0.2.2。打開甲骨文票據只是一個理論選項, ,因爲我們沒有直接的支持訪問權限,而且中間的層次更令人沮喪,因爲 與維護問題一起生活。
我知道,通常解釋計劃會有所幫助,但我們可以先嚐試解決方案,因爲 我懷疑是否有其他問題。
更新(二〇一三年十月十四日):
- 暗示使用嵌套循環不起作用。
- 基於函數的索引不被使用。
索引訪問:select * from v_vt_betreuer where vtid = 11803056;
散列訪問:select * from v_vt_betreuer where vtid = VTNRVOLL_TO_VTID(11803056);
複製視圖:即當視圖被複制到該應用架構
select * from v_vt_betreuer where vtid = VTNRVOLL_TO_VTID(11803056);
讓我看看我是否理解:您有一個視圖將兩個表加入一個字段。你有這張表的別名。你有一個確定性的功能。如果您通過函數的結果在其自己的模式中查詢視圖,則計劃將採用索引,但如果您通過別名查詢相同的視圖,則不會。是嗎? –
是的。聯合的第一部分是表「a」(兩次)與關聯表「b」的一級分層聯接。連接屬性不同於通用屬性(letz稱之爲vtid)。工會的另一張桌子非常小。如果別名與文字一起使用,則會再次使用索引。 – kiwiwings
對不起,最後的評論部分是錯誤的。共同屬性用於連接 - 例如'選擇a1.vtid,a2。*從代理a1加入agency_employee b(b.vtid = a1.vtid)加入代理a2(a2.vtid = b.employee_vtid)' – kiwiwings