在报表库的每个小时数据量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