OracleSQL优化案例-2

sql 复制代码
SELECT
     b.COMPANY_ID,
     a.TRD_DT,
     d.NET_PROF,
     d.OP_TINC,
     d.END_DT,
     ROW_NUMBER() OVER (PARTITION BY b.COMPANY_ID, a.TRD_DT ORDER BY d.END_DT DESC) AS rn
 FROM STK_HK_EXCH_QUOT a
          JOIN BASE_SECURITY_INFO b ON a.SECU_ID = b.SECURITY_ID
          JOIN COO_HK_INC_STMT d ON b.COMPANY_ID = d.CORP_ID
 WHERE d.END_DT <= a.TRD_DT
   AND d.DATA_FLAG_CD = 102
   AND d.NET_PROF IS NOT NULL AND d.OP_TINC IS NOT NULL ;
这段OracleSQL逻辑 请帮我加上大小表的关联hint优化,其中 a表和b表是百万数量级的,d表是十万数量级,a表有800w+,b表有200w+

针对你的数据量级(a表800w+,b表200w+,d表10w+),这里提供几个优化方案:

方案1:使用LEADING和USE_HASH提示(推荐)

复制代码
SELECT /*+ LEADING(a b d) USE_HASH(a b) USE_HASH(a d) */
    b.COMPANY_ID,
    a.TRD_DT,
    d.NET_PROF,
    d.OP_TINC,
    d.END_DT,
    ROW_NUMBER() OVER (PARTITION BY b.COMPANY_ID, a.TRD_DT ORDER BY d.END_DT DESC) AS rn
FROM STK_HK_EXCH_QUOT a
JOIN BASE_SECURITY_INFO b ON a.SECU_ID = b.SECURITY_ID
JOIN COO_HK_INC_STMT d ON b.COMPANY_ID = d.CORP_ID
WHERE d.END_DT <= a.TRD_DT
    AND d.DATA_FLAG_CD = 102
    AND d.NET_PROF IS NOT NULL 
    AND d.OP_TINC IS NOT NULL;

方案2:更精细的关联控制

复制代码
SELECT /*+ LEADING(a) USE_HASH(b) USE_HASH(d) SWAP_JOIN_INPUTS(d) */
    b.COMPANY_ID,
    a.TRD_DT,
    d.NET_PROF,
    d.OP_TINC,
    d.END_DT,
    ROW_NUMBER() OVER (PARTITION BY b.COMPANY_ID, a.TRD_DT ORDER BY d.END_DT DESC) AS rn
FROM STK_HK_EXCH_QUOT a
JOIN BASE_SECURITY_INFO b ON a.SECU_ID = b.SECURITY_ID
JOIN COO_HK_INC_STMT d ON b.COMPANY_ID = d.CORP_ID
WHERE d.END_DT <= a.TRD_DT
    AND d.DATA_FLAG_CD = 102
    AND d.NET_PROF IS NOT NULL 
    AND d.OP_TINC IS NOT NULL;

方案3:针对分区表的优化(如果相关表有分区)

复制代码
SELECT /*+ LEADING(a) FULL(a) FULL(b) FULL(d) USE_HASH(a b) USE_HASH(a d) PARALLEL(4) */
    b.COMPANY_ID,
    a.TRD_DT,
    d.NET_PROF,
    d.OP_TINC,
    d.END_DT,
    ROW_NUMBER() OVER (PARTITION BY b.COMPANY_ID, a.TRD_DT ORDER BY d.END_DT DESC) AS rn
FROM STK_HK_EXCH_QUOT a
JOIN BASE_SECURITY_INFO b ON a.SECU_ID = b.SECURITY_ID
JOIN COO_HK_INC_STMT d ON b.COMPANY_ID = d.CORP_ID
WHERE d.END_DT <= a.TRD_DT
    AND d.DATA_FLAG_CD = 102
    AND d.NET_PROF IS NOT NULL 
    AND d.OP_TINC IS NOT NULL;

关键优化点说明:

  1. LEADING提示 :强制指定表的连接顺序

    • 建议从最大的a表开始,然后连接b表,最后连接d表
  2. USE_HASH提示 :对大数据量连接使用哈希连接

    • 哈希连接适合大数据量的等值连接
  3. SWAP_JOIN_INPUTS(d) :让d表作为哈希连接的构建表

    • 因为d表最小(10w+),适合作为哈希表的构建端
  4. 索引建议(如果性能还不够):

    -- 为a表创建索引
    CREATE INDEX IDX_STK_HK_EXCH_QUOT_SECU_ID ON STK_HK_EXCH_QUOT(SECU_ID, TRD_DT);

    -- 为b表创建索引
    CREATE INDEX IDX_BASE_SEC_INFO_SEC_ID ON BASE_SECURITY_INFO(SECURITY_ID, COMPANY_ID);

    -- 为d表创建索引
    CREATE INDEX IDX_COO_HK_INC_STMT_CORP ON COO_HK_INC_STMT(CORP_ID, END_DT, DATA_FLAG_CD)
    WHERE NET_PROF IS NOT NULL AND OP_TINC IS NOT NULL;

其他建议:

  1. 先测试执行计划 :使用EXPLAIN PLAN FOR查看不同提示的执行计划
  2. 考虑分步处理:如果结果集仍然很大,可以考虑分步计算
  3. 定期收集统计信息:确保统计信息准确
  4. 使用并行查询 :如果硬件资源充足,可以考虑添加PARALLEL提示

建议先用方案1测试,观察执行计划,再根据实际情况调整。

相关推荐
幂律智能12 小时前
海外业务不同,合同系统该怎么建?
大数据·人工智能
Leo.yuan12 小时前
数据开发即质量检测:FineDataLink 5.0 在生产数据链路中的一体化实践
大数据
哲霖软件12 小时前
非标机械设备公司怎么做信息化?破解通用ERP水土不服难题
大数据·运维
IT毕设梦工厂13 小时前
计算机毕业设计选题推荐:基于大数据的杭州亚运会社交媒体互动数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·课程设计·数据分析数据可视化
Leo.yuan13 小时前
2026中国数据处理平台行业研究:实时、质量与一体化能力成为竞争重点
大数据
Leo.yuan14 小时前
企业可信Data Agent怎么建:可信分析智能体(Traceable Analytic Agent)的分析链路与验证机制
大数据·人工智能·机器学习
QY_Research_14 小时前
2026-2032年个人安全警报装置市场分析 CAGR4.7% 产业全景报告
大数据·人工智能·安全
AI行业说14 小时前
针织 T 恤、运动套装电脑模板机选型与落地指南
大数据·人工智能·机器人·自动化·智能模板机
码流子14 小时前
AI稽核精灵-Agent落地
大数据·人工智能·物联网·算法·系统架构
微三云 - 廖会灵 (私域系统开发)15 小时前
智慧社区 B 端深度剖析:消费返物业费 2.0,权益循环系统的业务、架构与避坑实践
大数据·架构