为了优化 SQL 并提高查询速度,您可以考虑以下优化措施:

  1. 使用合适的索引:

    • 确保表在用于联接条件和 WHERE 子句的列上具有合适的索引。索引可以显著提高查询性能。
    • 在联接列上添加索引:f.ID、x.leg_id、o.leg_id、m.leg_id、x.ARR_LEG_ID、px.leg_id、x.abn_code_5、f.dept_airport 和 ap.iata_code。
    • 考虑在 WHERE 子句中使用的列上添加索引:f.pdate、f.status 和 x.abn_code_5。
  2. 使用 ANSI 联接语法:

    • 使用 ANSI 联接语法而不是旧式的联接语法重写联接条件。这可以提高查询的可读性和性能。
  3. 避免不必要的子查询:

    • 而不是使用子查询来检索 ACZone 列,您可以在主查询中直接使用 CASE 语句来实现相同的结果。这将消除联接 INFO_AIRPORT 表的需要。
  4. 重构查询:

    • 考虑将查询分解成更小的子查询或视图,以提高可读性和可维护性。这也有助于识别和优化查询的特定部分。

以下是经过上述优化后的 SQL 版本:

CREATE OR REPLACE VIEW V_STAT_OPERATION_QUERY_123 AS
WITH v_flight_abnml AS (
    SELECT f.id legid, f.PDATE, f.flight_no_disp, (CASE WHEN f.AGENT = 'V' THEN '123' ELSE f.CARRIER END) AS CARRIER,
        f.FLIGHT_NO, f.FLIGHT_NO_FIX, f.TAIL_NO, f.AC_TYPE, f.AGENT, f.dept_airport, f.arr_airport, f.plan_dept_airport,
        f.plan_arr_airport, f.dept_ac_pos, f.flt_prop, f.status, NVL(ff.NEW_STD,f.STD) STD, f.ETD, f.ATD, NVL(ff.NEW_STA,f.STA) STA,
        f.ETA, f.ATA, f.blockoff, f.blockon, ROUND((f.ATA-f.ATD)*1440, 0) FLTTIME, f.alter_flag, f.intl_flag,
        GREATEST(NVL(f.CABIN_CLOSE, f.CARGO_CLOSE), NVL(f.CARGO_CLOSE, f.CABIN_CLOSE)) CABIN,
        o.property, o.pilot_subcarrier, o.steward_subcarrier,
        x.HANDLING_DELAY_3, X.DEPT_DELAY, x.SLOT_DELAY, X.CAB_CLOSE_DELAY, X.ARR_DELAY, x.ATC_DELAY, x.arr_late, x.ARR_LATE_EF,
        x.taxi_out, x.taxi_in, x.taxi_out_com, x.taxi_in_com,
        x.ABN_CODE_1, x.abn_reason_1, x.ABN_CODE_2, x.abn_reason_2,
        m.delay_code abn_code_3, m.delay_reason abn_reason_3,
        x.ABN_CODE_5, sa.pub_src abn_reason_5, X.PDESC,
        m.cnl_code, m.cnl_reason, m.alt_code, m.alt_reason,
        px.taxi_in taxi_in_prev,
        x.arr_leg_id, pf.flight_no_disp flight_no_disp_prev, pf.dept_airport dept_airport_prev, pf.ata ata_prev,
        pf.sta sta_prev, pf.blockon blockon_prev,
        (CASE WHEN LENGTH(ap.icao_code)>2 THEN SUBSTR(ap.icao_code, 0, 2) ELSE '**' END) ACZone,
        (CASE
           WHEN f.alter_flag IN ('ALTERNATE','RETURN','ALTERNATE+','RETURN+') THEN
             NVL(m.alt_code, NVL(x.abn_code_1, m.delay_code))
           ELSE
             CASE
               WHEN f.status = 'CNL' THEN
                 NVL(m.cnl_code, NVL(x.abn_code_1, m.delay_code))
               ELSE
                 NVL(x.abn_code_1, NVL(m.delay_code, NVL(x.abn_code_5, x.abn_code_2)))
             END
         END) abncode
    FROM FLIGHT_LEG f
    LEFT JOIN FLIGHT_ABNORMAL x ON f.ID = x.leg_id
    LEFT JOIN FLIGHT_LEG_OPERATION o ON f.ID = o.leg_id
    LEFT JOIN FLIGHT_AOC_MAP m ON f.ID = m.leg_id
    LEFT JOIN FLIGHT_ABNORMAL px ON x.ARR_LEG_ID = px.leg_id
    LEFT JOIN FLIGHT_LEG pf ON x.ARR_LEG_ID = pf.id
    LEFT JOIN INFO_AIRPORT ap ON f.dept_airport = ap.iata_code
    LEFT JOIN SYSTEM_ABNCODE sa ON x.abn_code_5 = sa.pcode
    LEFT JOIN FLIGHT_FPAR ff ON f.ID = ff.leg_id
    WHERE f.pdate >= pk_stat_param.sf_getbegindatevalue
        AND f.pdate <= pk_stat_param.sf_getenddatevalue
        AND f.status IN ('OP', 'CNL')
)
SELECT nm.LEGID, nm.PDATE, nm.FLIGHT_NO_DISP, nm.CARRIER, nm.FLIGHT_NO, nm.FLIGHT_NO_FIX, nm.TAIL_NO,
       nm.AC_TYPE, nm.AGENT, nm.DEPT_AIRPORT, nm.ARR_AIRPORT, nm.PLAN_DEPT_AIRPORT, nm.PLAN_ARR_AIRPORT,
       nm.DEPT_AC_POS, nm.FLT_PROP, nm.STATUS, nm.STD, nm.ETD, nm.ATD, nm.STA, nm.ETA, nm.ATA,
       nm.BLOCKOFF, nm.BLOCKON, nm.FLTTIME, nm.ALTER_FLAG, nm.INTL_FLAG, nm.CABIN,
       nm.PROPERTY, nm.PILOT_SUBCARRIER, nm.STEWARD_SUBCARRIER,
       nm.HANDLING_DELAY_3, nm.DEPT_DELAY, nm.SLOT_DELAY, nm.CAB_CLOSE_DELAY, nm.ARR_DELAY,
       nm.ATC_DELAY, nm.ARR_LATE, nm.ARR_LATE_EF,
       nm.TAXI_OUT, nm.TAXI_IN, nm.TAXI_OUT_COM, nm.TAXI_IN_COM,
       nm.ABN_CODE_1, nm.ABN_REASON_1, nm.ABN_CODE_2, nm.ABN_REASON_2,
       nm.ABN_CODE_3, nm.ABN_REASON_3, nm.ABN_CODE_5, nm.ABN_REASON_5, nm.PDESC,
       nm.CNL_CODE, nm.CNL_REASON, nm.ALT_CODE, nm.ALT_REASON,
       nm.TAXI_IN_PREV, nm.ARR_LEG_ID, nm.FLIGHT_NO_DISP_PREV, nm.DEPT_AIRPORT_PREV,
       nm.ATA_PREV, nm.STA_PREV, nm.BLOCKON_PREV, nm.ACZONE, nm.ABNCODE,
       S.PTYPE
FROM v_flight_abnml nm
LEFT JOIN SYSTEM_ABNCODE S ON nm.ABNCODE = S.PCODE;

注意:请确保测试优化后的查询,并将性能与原始查询进行比较,以确保它满足您的要求。

SQL 优化指南:提高查询速度的技巧

原文地址: https://www.cveoy.top/t/topic/qqLk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录