HASH JOIN 跟NESTED LOOP 快一个列子

本文对比了NESTED LOOP与HASH JOIN两种SQL连接方式在处理大量数据时的效率差异,前者耗时3分钟,后者仅需7秒。通过具体的SQL示例说明了在报表库中进行数据查询时不同连接方式的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在报表库的每个小时数据量23113条时候

NESTED LOOP 要跑3分钟 而  HASH JOIN 才7秒钟

 

NESTED LOOP:

SELECT *
  FROM    (  SELECT ACTIONID,
                    OPCONTENTID,
                    MOUDULEID,
                    PORTALID,
                    'lars01.OP_MAIL_VISIT_04_1105' AS table_name,
                    TO_DATE (20110501000000, 'yyyymmddhh24miss') + (9 / 24)
                       AS INSERTTIME_START,
                    TRUNC (TO_DATE (20110501000000, 'yyyymmddhh24miss'))
                    + ( (9 + 1) / 24)
                       AS INSERTTIME_END,
                    MIN (RECORDID) AS RECORDID,
                    COUNT (1) AS row_num
               FROM lars01.OP_MAIL_VISIT_03_1104
              WHERE inserttime >=
                       TO_DATE (20110501000000, 'yyyymmddhh24miss') + (9 / 24)
                    AND inserttime <
                           TRUNC (TO_DATE (20110501000000, 'yyyymmddhh24miss'))
                           + ( (9 + 1) / 24)
           GROUP BY ACTIONID,
                    OPCONTENTID,
                    MOUDULEID,
                    PORTALID) t
       LEFT JOIN
          (SELECT DISTINCT action_id,
                           module_iD,
                           portal_id,
                           opcontent_id
             FROM etl_rule s
            WHERE     rule_valid = 1
                  AND rule_type = '点击 '
                  AND TO_CHAR (action_id) IN (SELECT *
                                                FROM TABLE (
                                                        SELECT f_etl_proc (
                                                                  check_value01
                                                                  || ','
                                                                  || check_value02)
                                                          FROM etl_condition
                                                         WHERE condition_id =
                                                                  3))) s
       ON (    t.actionid = s.action_id
           AND t.opcontentid = s.opcontent_id
           AND t.MOUDULEID = s.module_iD
           AND t.PORTALID = s.portal_id)
 WHERE action_id IS NULL

 

DBA 说 etl_rule每条记录都要全表扫描 TABLE() 在开发库单独拿出该语句执行要122秒

而HASH JOIN 只要2.04秒

 

HASH JOIN:

 

SELECT *
  FROM    (  SELECT ACTIONID,
                    OPCONTENTID,
                    MOUDULEID,
                    PORTALID,
                    'lars01.OP_MAIL_VISIT_04_1105' AS table_name,
                    TO_DATE (20110501000000, 'yyyymmddhh24miss') + (9 / 24)
                       AS INSERTTIME_START,
                    TRUNC (TO_DATE (20110501000000, 'yyyymmddhh24miss'))
                    + ( (9 + 1) / 24)
                       AS INSERTTIME_END,
                    MIN (RECORDID) AS RECORDID,
                    COUNT (1) AS row_num
               FROM lars01.OP_MAIL_VISIT_03_1104
              WHERE inserttime >=
                       TO_DATE (20110501000000, 'yyyymmddhh24miss') + (9 / 24)
                    AND inserttime <
                           TRUNC (TO_DATE (20110501000000, 'yyyymmddhh24miss'))
                           + ( (9 + 1) / 24)
           GROUP BY ACTIONID,
                    OPCONTENTID,
                    MOUDULEID,
                    PORTALID) t
       LEFT JOIN
          (SELECT DISTINCT action_id,
                           module_iD,
                           portal_id,
                           opcontent_id
             FROM etl_rule s,(SELECT *
                                                FROM TABLE (
                                                        SELECT f_etl_proc (
                                                                  check_value01
                                                                  || ','
                                                                  || check_value02)
                                                          FROM etl_condition
                                                         WHERE condition_id =
                                                                  3)) b
            WHERE     rule_valid = 1
                  AND rule_type = '点击 '
                  AND TO_CHAR (action_id) = b.column_value
                  ) s
       ON (    t.actionid = s.action_id
           AND t.opcontentid = s.opcontent_id
           AND t.MOUDULEID = s.module_iD
           AND t.PORTALID = s.portal_id)
 WHERE action_id IS NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值