[英]Oracle 11 joining with view has high cost
將視圖連接到另一個表時遇到一些困難。 這是在運行11.2的Oracle RAC系統上
我將嘗試提供盡可能多的細節,而不必使用我的公司不希望使用的特定表結構。
你們都知道這是如何工作的。 “嘿,您能編寫一些非常丑陋的軟件來實施我們的瘋狂想法嗎?”
他們要我做什么的想法是,查看最終用戶不知道他們是要追隨新表還是舊表的視圖,因此其中一個表是一個參數表,它將返回“ ON”或“ OFF”,在case語句中使用。
select子句中有一些不太難但嵌套的case語句
我有一個觀點:
create view my_view as
select t1.a as a, t1.b as b, t1.c as c,
sum(case when t2.a = 'xx' then case when t3.a then ... ,
case when t2.a = 'xx' then case when t3.a then ... ,
from table1 t1
join table t2 on (t1.a = t2.a etc...)
full outer join t3 on (t1.a = t3.a etc...)
full outer join t4 on (t1.a = t4.a etc...)
group by t1.a, t1.b, t2.c, and all the ugly case statements...
現在,當我運行查詢時
select * from my_view where a='xxx' and b='yyy' and c='zzz'
查詢運行良好,成本為10。
但是,當我將此視圖與另一個表合並時,一切都崩潰了。
select * from my_table mt join my_view mv on (mt.a = mv.a and mt.b=mv.b and mt.c=mv.c) where ..."
一切都通過屋頂瓦解。
我認為正在發生的事情是謂詞沒有被推向視野。 這樣,視圖現在將進行全表掃描,並將所有內容連接到所有內容,然后最終刪除所有行。 每個提示,調整或我所做的任何事情似乎都無濟於事。
在查看計划時,看起來好像有謂詞。
但這一切都在加入之后發生。
抱歉,如果這是含糊的,則將不勝感激。
由於您的視圖帶有“ GROUP BY”,因此無法將謂詞推入內部查詢
另外,您在case語句中具有group by函數,這也可能使優化程序更糟
Oracle為Optimizer的每個版本/發行版/補丁引入了增強功能。 很難說您正在運行的版本支持什么。 但是,您可以嘗試:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.