Для очевидных причин производительности я хотел бы переписать существующий запрос Oracle SQL, который включает в себя коррелированные подзапросы, содержащие предложения «не в». Можно ли это сделать через внешние соединения или, возможно, какую-то другую технику?Переписывание коррелированного подзапроса с предложением «не в»
Вот код:
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'
)
)
;
Каковы «очевидные причины»? Я подозреваю, что использование 'trim()' в идентификаторах делает запрос менее эффективным, чем в противном случае. –
Опубликуйте свой план выполнения. –
Выполнение левого соединения и применение WHERE IS NULL столбца, как правило, MUCH FASTER. Однако, что сказано ... каков фактический тип данных «et.event_id» и «t1.transaction_evt_id». Если числовое значение, TRIM() плохое, как указано в Gordon. – DRapp