OR+DBLINK的关联SQL优化思路
前言
最近遇到个10来个OR条件关联的复杂SQL再加DBlink,明显感觉到Oracle 都关联懵了,2-3个小时都没出结果。感受一下SQL的魅力吧,此次测试旨在拓宽优化思路。
性能SQL
- 各表数据量:已做脱敏处理
INFO -- 4142 EXT -- 4142 CRM_INFO -- 4142 ACCT_ORDER -- 793841 NAME_LIST -- 159900
- OR条件仅展示部份。
select
a.ID as nameListId,a.UNIQUE_ID,a.NAME,a.COMMENTS,a.externale,a.TAG,b.INFO_ID,b.STATUS,b.AAM_ID
FROM (
SELECT id,unique_id,name,comments,externale,tag
FROM pay.name_list WHERE SOURCE = '0001'
AND TAG in ('card','merchant','RECNAME')
AND TYPE = '01'
) a
JOIN (
SELECT
INFO.ID INFO_ID,
INFO.NAME INFO_NAME,
CASE
WHEN SEL.NO_CIPHER IS NOT NULL AND SEL.FACTOR IS NOT NULL
THEN SM4@twodb(SEL.NO_CIPHER, SEL.FACTOR)
ELSE NULL END AS SEL_NO,
CASE
WHEN INFO.STATUS = 'A' AND INFO.STATUS_OUT = 'A' THEN 'A'
WHEN INFO.STATUS = 'A' AND INFO.STATUS_OUT = 'B' THEN 'C'
WHEN INFO.STATUS = 'B' AND INFO.STATUS_OUT = 'A' THEN 'B'
WHEN INFO.STATUS = 'B' AND INFO.STATUS_OUT = 'B' THEN 'D'
END AS STATUS,
EXT.LICENSE_NO,
AAM.ID AAM_ID
FROM INFO@twodb INFO
JOIN EXT@twodb EXT ON INFO.ID = EXT.INFO_ID
JOIN CRM_INFO@twodb SEL ON INFO.ID = SEL.INFO_ID
JOIN ACCT_ORDER@twodb AAM ON AAM.id = INFO.id
WHERE INFO.STATUS IN ('A', 'B')
) b
ON DECODE(a.tag,'merchant',a.unique_id,null) = b.INFO_ID
OR DECODE(a.tag,'RECNAME',a.unique_id,null) = b.INFO_NAME
OR decode(a.tag,'card',a.unique_id,null) = b.SEL_NO
OR DECODE(a.tag,'midno',a.unique_id,null) = b.LICENSE_NO ;
执行计划
性能问题分析
- 问题1、Elapsed:00:0