2014-02-12 63 views
0

我創建了一個包含8個表的聯合的視圖,產生了大約400萬條記錄。所涉及的所有表格都有索引。儘管如此,選擇查詢需要很長時間才能執行。有什麼方法可以提高性能?如何提高View上選擇查詢的性能?

視圖定義:

Create view view1(a,b,c,d) AS 
select a,b,c,d from 
table1 
UNION ALL 
select a,b,c,d from 
table2 
UNION ALL 
select a,b,c,d from 
table3 
UNION ALL 
select a,b,c,d from 
table4 
UNION ALL 
select a,b,c,d from 
table5.... 
--so on till table8; 

Select查詢:

select a,b,c,d 
    from view1 
where a=1 and b=-1 
order by c; 

指數細節:

指數上abc上所有表。

+1

第一個忠告:請確保您使用'UNION ALL',不'UNION'和理解上的差異。除此之外,沒有至少發佈一些示例代碼和查詢計劃的想法,沒有人能夠提供任何幫助。您是從視圖中選擇任何標準還是隻選擇該批次? –

+0

你好user2994919,請給我們看一些代碼,以便我們可以進一步幫助你。 –

+0

我使用UNION ALL – user2994919

回答

0

如果你有正確的索引,可能是你有陳舊的統計;如果是的話,請用DBMS_STATS包功能:

exec dbms_stats.gather_table_stats(your_schema, 'table1', estimate_percent=>100, cascade=>true, method_opt=>'FOR ALL COLUMNS SIZE AUTO'); 

使用此命令甲骨文自動收集直方圖過,在你的數據偏態分佈的情況下是有用的。

可能是Optimizer優先選擇全表掃描。 列a和b的選擇性是什麼?如果要選擇的行數太多(或者更好,需要掃描的塊太多),則索引無用。

0

一些相關的意見性能問題被鏈接入門解釋計劃將揭示什麼是真正發生光討論以下

http://www.dba-oracle.com/art_hints_views.htm

你也應該比較查詢的執行時間,而不以檢查是否有正在使用的視圖的額外開銷

查詢會像

選擇A,B,C,d從((從table1中選擇a,b,c,d,其中a = 1且b = -1)UNION ALL(從table2中選擇a,b,c,d,其中a = 1且b = -1)...)order by c ;

請檢查是否在解釋計劃中使用了索引。

原因有很多喜歡的類型轉換或丟失的統計數據,由於其指數可能沒有被使用

+0

I這篇文章中的幾乎所有內容都不同意。那裏有太多的陳述只是 - 真 - 有時候。例如,「一個視圖通常只用於臨時查詢系統,而初學者正在編寫SQL,而您想隱藏SQL的複雜性」。 –

+0

我發現了一些有用的建議,比如「重寫沒有視圖的SQL」,「開發人員經常會查詢複雜視圖的一個子集,而不是意識到視圖中的所有表都會被連接」,這種情況下可能會發生這種情況等等。我認爲最好的方法是研究解釋計劃並採取行動 – Deven

+0

有幾個有用的塊,但我不知道如何解釋類​​似這樣的事情:「要定期刷新物化視圖,可以使用機制這與Oracle快照類似。「物化視圖*是*快照!他們只是簡單地將快照重新命名爲「物化視圖」!或者:「請記住,優化程序每次遇到困惑時,都會執行不必​​要的全表掃描。」 ...或者它不會。優化器中沒有代碼路徑,因爲「如果讓人困惑......」 –