Below is a typical example of how using analytical functions speeds up a query, which is having a subquery inside.
Original query:
SELECT
DISTINCT CUSTOMER_ID, SUBSCRIBER_NO, TEST3.TEST3, MODEL_DESC,
ALT_MODEL_DESC
FROM TEST1, TEST2, TEST3
WHERE TEST1.CUSTOMER_ID = 517091995
AND TEST1.UNIT_ESN = ESN
AND TEST1.ESN_SEQ_NO =
(SELECT MAX (ESN_SEQ_NO)
FROM TEST1 PD1
WHERE PD1.CUSTOMER_ID = TEST1.CUSTOMER_ID
AND PD1.SUBSCRIBER_NO = TEST1.SUBSCRIBER_NO
AND LENGTH(UNIT_ESN) <> 20 )
AND TEST2.TEST3 = TEST3.TEST3
AND ( TEST3.EXPIRATION_DATE IS NULL OR TEST3.EXPIRATION_DATE >= SYSDATE )
;
The new query, using analytical functions (much faster and accesing the TEST1 table only once):
SELECT
DISTINCT CUSTOMER_ID, SUBSCRIBER_NO, TEST3.TEST3, MODEL_DESC,
ALT_MODEL_DESC
FROM
(select UNIT_ESN,ESN_SEQ_NO,CUSTOMER_ID, SUBSCRIBER_NO, max(ESN_SEQ_NO) over (partition by CUSTOMER_ID,SUBSCRIBER_NO) as max_ESN_SEQ_NO
from TEST1 where LENGTH(UNIT_ESN) <> 20 ) phd, TEST2, TEST3
WHERE phd.CUSTOMER_ID = 517091995
and ESN_SEQ_NO=phd.max_ESN_SEQ_NO
AND UNIT_ESN = ESN
AND TEST2.TEST3 = TEST3.TEST3
AND ( TEST3.EXPIRATION_DATE IS NULL OR TEST3.EXPIRATION_DATE >= SYSDATE)
;
No comments:
Post a Comment