簡體   English   中英

Oracle 11與視圖連接成本很高

[英]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的每個版本/發行版/補丁引入了增強功能。 很難說您正在運行的版本支持什么。 但是,您可以嘗試:

  1. 看看是否從GROUP BY函數中刪除案例會有所不同
  2. 否則,您必須將GROUP BY和GROUP BY函數從視圖中帶到最外面的查詢

在額頭上出現許多鍵盤縮進之后,我可能欺騙了Oracle推謂詞。 我不知道為什么會這樣,但是簡化事情可能有所幫助。

我將所有ON子句更改為USING子句,這樣,列名現在與我要加入的列匹配。 在某些其他謂詞常量上,我在視圖的where子句中添加了該謂詞。

最終結果是,我現在可以將該視圖與另一個表連接起來,並且開銷是合理的,並且該計划顯示謂詞已被推送。 在此處輸入圖片說明

感謝所有關注此問題的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM