명백한 성능상의 이유로 "in"절이 포함 된 상관 하위 쿼리를 포함하는 기존 Oracle SQL 쿼리를 다시 작성하고 싶습니다. 외부 조인 또는 다른 기술을 통해이 작업을 수행 할 수 있습니까?"in in"절을 사용하여 상관 관계가있는 부속 쿼리 다시 작성
SELECT TRIM(et.event_id), TRIM(et.cancel_evt_id)
FROM external_transactions et
JOIN transaction_type tt
ON et.transaction_type_id = tt.transaction_type_id
WHERE et.acct = 'ABCDEF'
AND tt.transaction_type_class != 'XYZXYZ'
AND
(
TRIM(et.event_id) NOT IN
(
SELECT TRIM(t1.transaction_evt_id)
FROM transactions t1
WHERE t1.acct = et.acct
AND t1.asset_id = et.asset_id
AND t1.cancel_flag = 'N'
)
OR TRIM(et.cancel_evt_id) NOT IN
(
SELECT TRIM(t2.cancel_evt_id)
FROM transactions t2
WHERE t2.acct = et.acct
AND t2.asset_id = et.asset_id
AND t2.cancel_flag = 'Y'
)
)
;
"분명한 이유"는 무엇입니까? id에'trim() '을 사용하면 질의가 덜 효율적이게된다고 생각됩니다. –
실행 계획을 게시하십시오. –
왼쪽 조인을 수행하고 열의 WHERE IS NULL을 적용하는 것은 대개 훨씬 빠릅니다. 그러나, 그 말은 ... "et.event_id"및 "t1.transaction_evt_id"의 실제 데이터 유형은 무엇입니까? 숫자 일 경우, TRIM()을 수행하는 것은 Gordon이 말한 것처럼 좋지 않습니다. – DRapp