
While you are sleeping, there are lots of programs are running based on it’s scheduling. They are often called “Batch Jobs“. And one of batch jobs is to get rid of old transactions.
In Biz apps, we often need to do performance tuning. According to my experience, the SQL is usually the biggest reason to cause a performance issue.
I have a memory that I have a performance issue for this SQL.
This is to get the target records for Data Purge (Oracle):
SELECT
*
FROM TABLE_TO_BE_PURGED A
WHERE
EXISTS (
SELECT '*'
FROM
PURGE_TARGET_TABLE TGT
WHERE 1=1
AND TGT.INV_NUM = A.REF_TXT_01
) OR EXISTS (
SELECT '*'
FROM
INTEREFACE_TABLE ITFC,
PURGE_TARGET_TABLE TGT
WHERE
ITFC.REF_NUM = B.REF_NUM
AND ITFC.REF_SUB_NUM = B.REF_SUB_NUM
AND ITFC.INV_NUM = TGT.INV_NUM
)
And came up with this after struggling hours…
SELECT
*
FROM TABLE_TO_BE_PURGED A1
WHERE EXISTS (
SELECT '*'
FROM (
SELECT
B1.PURGED_PK
FROM
TABLE_TO_BE_PURGED B1
, PURGE_TARGET_TABLE TGT
WHERE 1=1
AND TGT.INV_NUM = B1.REF_TXT_01
UNION
SELECT
B2.PURGED_PK
FROM
TABLE_TO_BE_PURGED B2
, INTEREFACE_TABLE ITFC
, PURGE_TARGET_TABLE TGT
WHERE
ITFC.REF_NUM = B2.REF_NUM
AND ITFC.REF_SUB_NUM = B2.REF_SUB_NUM
AND ITFC.INV_NUM = TGT.INV_NUM
) T1
WHERE T1.PURGED_PK = A1.PURGED_PK
)
The performance improved dramatically, but the interesting thing was that the execution plan (cost) was pretty much the same. The one above get slower when having more records. And the one below was fast enough although having many records.