SQL 查询优化:提高 V_STAT_OPERATION_QUERY_123 视图的查询速度
为了优化给定的 SQL 查询并提高查询速度,您可以考虑以下优化措施:
-
对查询涉及的表使用适当的索引来提高数据检索速度。分析查询执行计划,识别用于连接条件、过滤和排序的列。在这些列上创建索引以加速查询。
-
将查询重写为使用显式 JOIN 语法,而不是隐式连接。这可以帮助优化器更好地理解查询并优化执行计划。
-
从 SELECT 子句中移除不需要的列,这些列对输出没有用。这可以减少传输的数据量并提高性能。
-
如果视图中的数据不经常变化,请考虑使用物化视图而不是视图。物化视图存储查询结果,可以定期刷新,从而提供对数据的更快访问。
-
检查 WHERE 子句条件,确保条件已正确索引。如有必要,修改条件或添加其他索引以提高查询性能。
-
分析子查询和 WITH 子句的性能。如果它们导致性能问题,请考虑分别优化这些查询部分。
-
考虑使用查询提示或优化器指令来引导优化器为查询选择最有效的执行计划。
总而言之,分析数据库模式、索引和统计信息,以及使用 explain 计划和查询执行统计信息等工具监控查询性能至关重要。这将有助于识别任何瓶颈并相应地优化查询。
以下是对 SQL 查询的重写版本,该版本使用显式 JOIN 语法并简化了代码:
CREATE OR REPLACE VIEW V_STAT_OPERATION_QUERY_123 AS
SELECT
f.id AS 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) AS STD,
f.ETD,
f.ATD,
NVL(ff.NEW_STA, f.STA) AS STA,
f.ETA,
f.ATA,
f.blockoff,
f.blockon,
ROUND((f.ATA - f.ATD) * 1440, 0) AS FLTTIME,
f.alter_flag,
f.intl_flag,
GREATEST(NVL(f.CABIN_CLOSE, f.CARGO_CLOSE), NVL(f.CARGO_CLOSE, f.CABIN_CLOSE)) AS 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 AS abn_code_3,
m.delay_reason AS abn_reason_3,
x.ABN_CODE_5,
sa.pub_src AS abn_reason_5,
X.PDESC,
m.cnl_code,
m.cnl_reason,
m.alt_code,
m.alt_reason,
px.taxi_in AS taxi_in_prev,
x.arr_leg_id,
pf.flight_no_disp AS flight_no_disp_prev,
pf.dept_airport AS dept_airport_prev,
pf.ata AS ata_prev,
pf.sta AS sta_prev,
pf.blockon AS blockon_prev,
CASE WHEN LENGTH(ap.icao_code) > 2 THEN SUBSTR(ap.icao_code, 0, 2) ELSE '**' END AS 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 AS abncode,
s.PTYPE
FROM FLIGHT_LEG f
JOIN FLIGHT_ABNORMAL x ON f.ID = x.leg_id(+)
JOIN FLIGHT_LEG_OPERATION o ON f.ID = o.leg_id(+)
JOIN FLIGHT_AOC_MAP m ON f.ID = m.leg_id(+)
JOIN FLIGHT_FPAR ff ON f.ID = ff.leg_id(+)
LEFT JOIN FLIGHT_LEG pf ON x.ARR_LEG_ID = pf.id
LEFT JOIN FLIGHT_ABNORMAL px ON x.ARR_LEG_ID = px.leg_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 SYSTEM_ABNCODE s ON abncode = s.PCODE
WHERE f.pdate >= pk_stat_param.sf_getbegindatevalue
AND f.pdate <= pk_stat_param.sf_getenddatevalue
AND f.status IN ('OP', 'CNL');
此重写版本使用了显式 JOIN 语法,并使用 LEFT JOIN 将外连接替换为隐式连接。它还从 SELECT 子句中删除了不必要的列,并通过使用 AS 关键字简化了列别名。
此外,您还可以考虑创建索引来提高查询性能。例如,您可以在 FLIGHT_LEG 表的 pdate、id、status 和 dept_airport 列上创建索引,以及在 FLIGHT_ABNORMAL 表的 leg_id 和 arr_leg_id 列上创建索引。
通过实施这些优化措施,您可以显著提高 SQL 查询的性能并减少查询时间。请记住,在实际应用中进行测试以确定对您的具体情况最有效的优化措施。
原文地址: https://www.cveoy.top/t/topic/qqLd 著作权归作者所有。请勿转载和采集!