2013-03-01 4 views
0

Не могли бы вы помочь мне оптимизировать следующий запрос «Весь союз»? Любая идея, с чего начать? Подробнее: SQL Plan показываетОптимизировать союз Все SQL

| 7 | ТАБЛИЦА ДОСТУПА ПОЛНОСТЬЮ | DELAY_DATE | 17533 | 171K | 25 (0) | 00:00:01 |
| 8 | ТАБЛИЦА ДОСТУПА ПОЛНОСТЬЮ | ВАКАНСИИ | 25879 | 454K | 298 (1) | 00:00:04 |

| 16 | MERGE ПРИСОЕДИНЯЙТЕСЬ КАРТЕТИЮ | | 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

Какие индексы у вас есть на этих таблицах? –

+0

Вы должны попробовать привыкнуть к префиксу всех столбцов с псевдонимами имен таблиц. В этом случае достаточно понятно, в каких таблицах присутствуют столбцы, но они более надежны и помогают чтению включать их. –

ответ

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

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 

Затем вызовите SQL предложенный @Hogan.

+0

Большое спасибо! – user1617237