SQL优化记录


1. 确认需求场景

如果您的目标是:
筛选每个保单的最新事件(当前逻辑已实现)
排除重复数据(如多行相同 policy_no 但不同 event_date_s
处理性能问题(如大数据量下运行缓慢)

请明确具体需求,我可以针对性优化。


2. 常见优化建议

(1) 索引优化

在优化后的查询中,确保以下字段有索引:

-- clmm 表
CREATE INDEX idx_clmm_policy ON clmm(policy_no, claim_process_code);

-- clco 表
CREATE INDEX idx_clco_claim ON clco(claim_no);

-- clsv 表
CREATE INDEX idx_clsv_claim_cov ON clsv(claim_no, coverage_no);

-- clcb 表
CREATE INDEX idx_clcb_plan ON clcb(plan_code, cl_rvf_type);

-- clbf 表
CREATE INDEX idx_clbf_benef_code ON clbf(benef_code, benef_status_code);
(2) 避免冗余计算

如果某些字段(如 benef_auto_value)在后续处理中不需要,可移除冗余条件:

-- 移除非必要过滤(示例)
-- AND e.benef_auto_value > 0  -- 如果后续不依赖此字段
(3) 分页或限制结果集

如果数据量极大,可添加 LIMIT 或分页逻辑:

WHERE rw = 1
LIMIT 1000;  -- 示例:仅返回前1000条

3. 验证查询逻辑

(1) 窗口函数确定性

当前使用 ORDER BY event_date_s, claim_no 确保排序唯一性,如果 event_date_s 可能重复,需确认是否需要其他字段(如 event_time)作为第二排序键。

(2) 联合条件覆盖

检查 OR 逻辑是否遗漏条件:

WHERE 
  (d.cl_rvf_type IN ('A','B','C') AND e.benef_status_code IN ('0','1','2','3','4','5'))
  OR 
  (d.cl_rvf_type = 'N' AND e.benef_status_code IN ('0','1','2','3','4','5','6'))

确保两种分支的条件互斥且完整。


4. 执行计划分析

如果查询性能不佳,可分析执行计划:

EXPLAIN ANALYZE
SELECT claim_no, policy_no
FROM (...) lm
WHERE rw = 1;

关注以下指标:
Table Scan:是否存在全表扫描(需索引优化)
Join Order:是否按最优顺序连接表
Filter Ratio:过滤条件是否有效减少数据量


5. 其他潜在问题

字段类型一致性:确认 event_date_s 是日期类型,非字符串。
分区表支持:如果数据量极大,可考虑对 policy_noevent_date 进行分区。
冗余子查询:如果后续需要扩展其他字段,避免在子查询中重复计算。


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kboy01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值