2013-03-01 118 views
0

你能幫我優化下面的聯盟所有查詢嗎? 任何想法從哪裏開始? 詳情: SQL計劃顯示優化聯盟所有SQL

| 7 | TABLE ACCESS FULL | DELAY_DATE | 17533 | 171K | 25(0)| 00:00:01 |
| 8 | TABLE ACCESS FULL |空間| 25879 | 454K | 298(1)| 00:00:04 |

| 16 | MERGE加入CARTESIAN | | 17533 | 273K | 28(4)| 00:00:01 |

這些潛在的問題是?

SELECT delay_reason_desc, delay_start_date, delay_end_date, delay_reason_code 
    FROM  delay_date dd 
    LEFT JOIN delay_reason dr 
    ON   dr.delay_reason_id=dd.delay_reason_id 
    LEFT JOIN delay_interval di 
    ON   di.delay_interval_id=dr.delay_interval_id 
    LEFT JOIN vacancy v 
    ON   v.vacancy_id=dd.vacancy_id 
    WHERE  dr.delay_reason_active_ind='Y' 
    --AND   dd.vacancy_id=p_vacancy_id 
    AND   delay_start_date >= vacancy_fpps_received_date 
    AND   delay_end_date <= vacancy_open_date 
    AND   delay_interval_code=1 


UNION ALL 
    SELECT delay_reason_desc, delay_start_date, delay_end_date, delay_reason_code 
    FROM  delay_date dd 
    LEFT JOIN delay_reason dr 
    ON   dr.delay_reason_id=dd.delay_reason_id 
    LEFT JOIN delay_interval di 
    ON   di.delay_interval_id=dr.delay_interval_id 
    LEFT JOIN vacancy v 
    ON   v.vacancy_id=dd.vacancy_id 
    WHERE  dr.delay_reason_active_ind='Y' 
    --AND   dd.vacancy_id=p_vacancy_id 
    AND   delay_start_date >= vacancy_open_date 
    AND   delay_end_date <= vacancy_closed_date 
    AND   delay_interval_code=2 
+0

你對這些表有什麼指標? – 2013-03-01 16:49:28

+0

你應該嘗試養成爲表名別名加上前綴的習慣。在這種情況下,列中列出了哪些表是合理的,但它更強大,並且可以幫助閱讀幷包含它們。 – 2013-03-02 07:05:30

回答

5

這個怎麼樣 - 可能高達兩倍的速度:

SELECT delay_reason_desc, delay_start_date, delay_end_date, delay_reason_code 
    FROM  delay_date dd 
    LEFT JOIN delay_reason dr 
    ON   dr.delay_reason_id=dd.delay_reason_id 
    LEFT JOIN delay_interval di 
    ON   di.delay_interval_id=dr.delay_interval_id 
    LEFT JOIN vacancy v 
    ON   v.vacancy_id=dd.vacancy_id 
    WHERE  dr.delay_reason_active_ind='Y' 

    AND ((delay_start_date >= vacancy_fpps_received_date 
     AND delay_end_date <= vacancy_open_date 
     AND delay_interval_code=1) 
    OR (delay_start_date >= vacancy_open_date 
      AND delay_end_date <= vacancy_closed_date 
      AND delay_interval_code=2)) 
+0

已用:00:00:00.234 VS已用:00:00:00.046非常感謝! – user1617237 2013-03-01 17:42:24

1
create index delay_reason on delay_reason_id 
create index delay_interval on delay_interval_id 
create index vacancy on vacancy_id 

create index delay_date on delay_reason_active_ind, delay_interval_code 

然後調用由@Hogan建議的SQL。

+0

非常感謝! – user1617237 2013-03-01 17:35:26