2012-11-27 56 views
1
Col 1, 
col 2, 
..... 
..... 
from 
table1, 
table2 
........ 
........ 
where 
join conditions1 
join conditions1 
................ 
................. 
and 
table1.day_key >= (select key from date_dim where value='01-JAN-2011') 
and table1.day_key <= (select key from date_dim where value='31-DEC-2011') 
and 
table2.day_key >= (select key from date_dim where value='01-JAN-2011') 
and table2.day_key <= (select key from date_dim where value='31-DEC-2011') 

在這裏我可以看到date_dim表正在做掃描四在哪裏條件,如何避免它。在from子句中未選擇date_dim表。我沒有環境去測試這個不幸的事情。數據庫是Oracle 10g中避免不必要的表掃描

+0

有趣的問題,雖然我沒有看到任何性能問題掃描該維度表兩次。 –

+0

它的4倍我猜... –

+0

是的,兼作必要的。我爲你的問題寫了一個解決方案的答案。該表將被掃描每個值只有一次,但你會在需要控制的執行計劃。 –

回答

0

正如我所說,我沒有看到性能問題掃描該表的兩倍,如有必要。

查詢的純改寫爲:

select 
    Col 1, 
    col 2, 
from 
    table1, 
    table2, 
    date_dim date_dim_start, 
    date_dim date_dim_end 
where 
    join conditions1 
    join conditions1 and 
    table1.day_key >= date_dim_start.key and 
    table1.day_key <= date_dim_end.key and 
    table2.day_key >= date_dim_start.key and 
    table2.day_key <= date_dim_end.key and 
    date_dim_start.value = '01-JAN-2011' and 
    date_dim_end.value='31-DEC-2011'; 

但是,你應該測試一下,爲了不遭受性能損失。

+0

我會測試,它看起來更好,而不是寫4 sql查詢。 –

1

答案顯然是在date_dim(value)添加索引。在此之前,請檢查表格中的行數。如果有小於100,表掃描是不是所有壞事。

您可以將它移動到cross join,像避免包括相同的子查詢兩次:

from ... 
cross join 
     (
     select key 
     from date_dim 
     where value='01-JAN-2011' 
     ) as dt1 
.... 
where table1.day_key >= dt1.key 
+0

我的問題是在查詢中,我們選擇了2個值,併爲那4次選擇一個表,有什麼辦法可以避免它?一個選項是與子句。除此之外的任何東西? –

1

使用可以子句中使用來自DATE_DIM得到鍵的值,並加入where子句中的相同。 此同時與子句中的值存儲在臨時空間使用會加快您的查詢獲取原因。

+0

我將檢查with clause的語法,並會嘗試測試它.. –