2012-10-23 106 views
0

我有以下選擇語句:甲骨文選擇語句性能

(
    SELECT CAL_DATE,BUS_DAY 
    FROM risk_mart.vw_calendar_t5 
    WHERE type = 'RPC' 
    AND BUS_DAY BETWEEN 0 AND 1 
) CAL 
WHERE t.cal_date   = cal.cal_date 

它選擇所有的日期,然後過濾他們between 0和1(只顯示兩個日期例如'22 -OCT-12 」,'19 -OCT-12' )。

現在,我可以重新編寫手動作爲

WHERE t.cal_date在('22 -OCT-12' , '19-OCT-12')

的差是表現。第一個例子我在90秒內返回,第二個例子,我在10秒內得到它。爲什麼?。

我該如何改進第一條語句/重寫它?

回答

0
FROM 
(
    SELECT CAL_DATE,BUS_DAY 
    FROM risk_mart.vw_calendar_t5 
    WHERE type = 'RPC' 
    AND BUS_DAY BETWEEN 0 AND 1 
) CAL --inner view 
WHERE t.cal_date   = cal.cal_date --join of table t and CAL 

現在,這是你的。在這第一個查詢您第一次檢索記錄成內部視圖CAL這需要一定的時間。而之後您加入t.cal_date = cal.cal_date這將再次需要一定的時間( TOTAL 90Sec)。

現在,這是第二個查詢。

FROM T 
WHERE t.cal_date  IN ('22-OCT-12','19-OCT-12'); 

在這種情況下,你使用力的內部景觀,讓你總算直接將dates和使用,在您的WHERE條件(硬編碼)。這是你有減少的處理時間內部視圖(CAL)和CAL表與表t的連接。

0

讓我們重新寫你這樣的代碼?

Case 1: 
    from 
     Cal 
    Inner join 
    t on cal.cal_date = t.cal.date 

    case 2: 
     from t 
     where t.cal_date in (....) 

Select語句第一步始終是「FROM」子句。在情況2中,第一步始終是FROM子句。就你而言,這是非常直接的,因爲只有一個表,並且沒有任何複雜的連接擔心。

在案例1中,一個含有連接的查詢,這些在第一步中被評估。連接被組合起來決定檢索哪些行,ON子句條件是決定從每個表中加入哪些行的條件。 FROM子句的結果是中間結果。你可以把它看作一個臨時表,由滿足所有連接條件的組合行組成。

這就是爲什麼情況1需要比情況2更長的時間。