1

次の Union All クエリの最適化を手伝っていただけませんか? どこから始めればよいですか?詳細: SQL 計画が表示されます

| | 7 | テーブル アクセスがフル | DELAY_DATE | 17533 | 171K| 25 (0)| 00:00:01 |
| | 8 | テーブル アクセスがフル | 空室 | 25879 | 454K| 298 (1)| 00:00:04 |

| | 16 | マージ結合デカルト | | | 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
4

2 に答える 2

6

これはどうですか -- 2 倍の速度になる可能性があります。

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))
于 2013-03-01T16:50:36.010 に答える
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 を呼び出します。

于 2013-03-01T16:54:30.277 に答える