2013-10-16 64 views
0

我正在使用Oracle 11g。在oracle視圖中優化外連接

我有一個1016736行的大表和2007行的另一個小表。我想將這兩張表加入一個視圖。

我加入這些表如下。

其中big_table.id = small_table.id(+)

我假設,這將形成通過查看小表1016736倍的圖。有沒有更好的方法來做到這一點?

查詢速度比現在慢,我想讓它更快。

任何想法將不勝感激,因爲我是Oracle的新手。編輯--- 這是我認爲的腳本。

select a.col1, a.col2, a.col100, b.col1, b.col2, b.col3 
from big_table a, small_table b where a.col1 = b.col1 (+) 
+4

如果您希望更快速地完成某項工作,您需要發佈完整查詢,表格索引和查詢說明計劃......如果沒有它們,幾乎不可能有效地幫助您。 – Ben

+0

我不想更快地做出任何特定的查詢。我正在嘗試簡化「從視圖中選擇計數(*)」的速度。如果你想要視圖的查詢,它只是從兩個表中選擇,其中所有列在哪裏bug_table.id = small_table.id(+) – Jeevan

+0

因此,你的查詢是_just_'從big_table中選擇count(*)b left outer join small_table s on b.id = s.id'? – Ben

回答

0

該連接是好的,只需在每個表的「Id」上創建一個索引即可。

嘗試更新的統計數據:

爲每個表:

ANALYZE TABLE XXXX_TABLE DELETE STATISTICS; 

ANALYZE TABLE XXXX_TABLE COMPUTE STATISTICS; 
+0

這兩個表的索引已經存在 – Jeevan

+0

這應該是相當快的100萬條記錄不是那麼多。嘗試更新統計信息(檢查我的更新回答) –

+0

我做過'EXEC DBMS_STATS.GATHER_TABLE_STATS('schema','table');'已經。事實上,它現在計劃在每個晚上運行。你和我的不一樣嗎? – Jeevan

2

如果你打算從沒有放在任何一個表的任何謂詞視圖中選擇那麼甲骨文將要估計加入基數基於不同值的數量以及連接列中的最大值和最小值以及存在的任何直方圖 - 預計的行數可以是從0到1016736 x 2007之間的任意值(當連接列各自具有相同的單個值每排)

連接類型將取決於此估計。

通常情況下,您會看到這種查詢類型的哈希外部聯接,與讀取查詢投影所需的數據相比,這非常高效,成本幾乎沒有。對於簡單計數(*),如果您在連接列上有索引,並且大表的連接列被限制爲NOT NULL(或者您使用某種方法確保空值包含在索引中),那麼他們可以快速全面掃描,並且結果散列外部加入。性能會非常好。

如果您有特別的查詢速度慢,那麼需要一個執行計劃來幫助優化。