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_no
或 event_date
进行分区。
• 冗余子查询:如果后续需要扩展其他字段,避免在子查询中重复计算。