SQL 优化指南:提高查询速度的技巧
为了优化 SQL 并提高查询速度,您可以考虑以下优化措施:
-
使用合适的索引:
- 确保表在用于联接条件和 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。
-
使用 ANSI 联接语法:
- 使用 ANSI 联接语法而不是旧式的联接语法重写联接条件。这可以提高查询的可读性和性能。
-
避免不必要的子查询:
- 而不是使用子查询来检索 ACZone 列,您可以在主查询中直接使用 CASE 语句来实现相同的结果。这将消除联接 INFO_AIRPORT 表的需要。
-
重构查询:
- 考虑将查询分解成更小的子查询或视图,以提高可读性和可维护性。这也有助于识别和优化查询的特定部分。
以下是经过上述优化后的 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;
注意:请确保测试优化后的查询,并将性能与原始查询进行比较,以确保它满足您的要求。
原文地址: https://www.cveoy.top/t/topic/qqLk 著作权归作者所有。请勿转载和采集!