SELECT
XCRV.CROSS_REFERENCE JENIS
,
XTD_INV_CONVERT_QTY_UOM_FNC (
(select min(mcrv2.INVENTORY_ITEM_ID)
from XTD_CROSS_REFF_ITEM_V mcrv2
where 1=1
and mcrv2.cross_reference = XCRV.CROSS_REFERENCE
and mcrv2.organization_id = MMT.ORGANIZATION_ID) ,
MMT.ORGANIZATION_ID,
(SELECT NVL(SUM(MMT2.PRIMARY_QUANTITY), 0)
FROM
MTL_MATERIAL_TRANSACTIONS MMT2,
XTD_CROSS_REFF_ITEM_V XCRV2
WHERE
MMT2.ORGANIZATION_ID = XCRV2.ORGANIZATION_ID
AND MMT2.INVENTORY_ITEM_ID = XCRV2.INVENTORY_ITEM_ID
AND XCRV2.CROSS_REFERENCE = XCRV.CROSS_REFERENCE
AND TRUNC(MMT2.TRANSACTION_DATE) <= TRUNC( TO_DATE( :P_DATE_FROM, 'YYYY/MM/DD' ) )
),
MSIB.PRIMARY_UOM_CODE,
'BAL'
) || '-' || XTD_INV_CONVERT_QTY_UOM_FNC (
(select min(mcrv2.INVENTORY_ITEM_ID)
from XTD_CROSS_REFF_ITEM_V mcrv2
where 1=1
and mcrv2.cross_reference = XCRV.CROSS_REFERENCE
and mcrv2.organization_id = MMT.ORGANIZATION_ID) ,
MMT.ORGANIZATION_ID,
(SELECT NVL(SUM(MMT2.PRIMARY_QUANTITY), 0)
FROM
MTL_MATERIAL_TRANSACTIONS MMT2,
XTD_CROSS_REFF_ITEM_V XCRV2
WHERE
MMT2.ORGANIZATION_ID = XCRV2.ORGANIZATION_ID
AND MMT2.INVENTORY_ITEM_ID = XCRV2.INVENTORY_ITEM_ID
AND XCRV2.CROSS_REFERENCE = XCRV.CROSS_REFERENCE
AND TRUNC(MMT2.TRANSACTION_DATE) <= TRUNC( TO_DATE( :P_DATE_FROM, 'YYYY/MM/DD' ) )
),
MSIB.PRIMARY_UOM_CODE,
'PRS'
) || '-' || XTD_INV_CONVERT_QTY_UOM_FNC (
(select min(mcrv2.INVENTORY_ITEM_ID)
from XTD_CROSS_REFF_ITEM_V mcrv2
where 1=1
and mcrv2.cross_reference = XCRV.CROSS_REFERENCE
and mcrv2.organization_id = MMT.ORGANIZATION_ID) ,
MMT.ORGANIZATION_ID,
(SELECT NVL(SUM(MMT2.PRIMARY_QUANTITY), 0)
FROM
MTL_MATERIAL_TRANSACTIONS MMT2,
XTD_CROSS_REFF_ITEM_V XCRV2
WHERE
MMT2.ORGANIZATION_ID = XCRV2.ORGANIZATION_ID
AND MMT2.INVENTORY_ITEM_ID = XCRV2.INVENTORY_ITEM_ID
AND XCRV2.CROSS_REFERENCE = XCRV.CROSS_REFERENCE
AND TRUNC(MMT2.TRANSACTION_DATE) <= TRUNC( TO_DATE( :P_DATE_FROM, 'YYYY/MM/DD' ) )
),
MSIB.PRIMARY_UOM_CODE,
'BKS'
) AS SALDO_AWAL
FROM
MTL_MATERIAL_TRANSACTIONS MMT,
MTL_TRANSACTION_TYPES MTT,
MTL_SYSTEM_ITEMS_B MSIB,
XTD_CROSS_REFF_ITEM_V XCRV,
ORG_ORGANIZATION_DEFINITIONS OOD,
HR_OPERATING_UNITS HOU,
GL_LEDGERS GL
WHERE
MMT.INVENTORY_ITEM_ID = MSIB.INVENTORY_ITEM_ID
AND MMT.ORGANIZATION_ID = MSIB.ORGANIZATION_ID
AND MMT.TRANSACTION_TYPE_ID = MTT.TRANSACTION_TYPE_ID
AND MMT.ORGANIZATION_ID = OOD.ORGANIZATION_ID
AND XCRV.INVENTORY_ITEM_ID = MMT.INVENTORY_ITEM_ID
AND HOU.BUSINESS_GROUP_ID = OOD.BUSINESS_GROUP_ID
AND OOD.SET_OF_BOOKS_ID = GL.LEDGER_ID
--HARDCODE
AND HOU.ORGANIZATION_ID NOT IN ('82')
AND XCRV.CROSS_REFERENCE = 'ARB12'
-- PARAMETERS
AND GL.LEDGER_ID = NVL(:P_LEDGER, GL.LEDGER_ID)
AND HOU.ORGANIZATION_ID = NVL(:P_OU_ID, HOU.ORGANIZATION_ID)
AND OOD.ORGANIZATION_ID = NVL(:P_CABANG, OOD.ORGANIZATION_ID)
-- HEADING
AND TRUNC(MMT.TRANSACTION_DATE) BETWEEN TRUNC( TO_DATE( :P_DATE_FROM, 'YYYY/MM/DD' )) AND TRUNC( TO_DATE( :P_DATE_TO, 'YYYY/MM/DD' ))
GROUP BY
XCRV.CROSS_REFERENCE,
MMT.ORGANIZATION_ID,
MSIB.PRIMARY_UOM_CODE
ORDER BY
XCRV.CROSS_REFERENCE
Please optimize my query snippet. When hardcoding only one piece of data, it takes about 4 minutes to execute. However, there are still many data to be loaded, and I also have other columns to add.
When I try to run the query for just one piece of data, it takes about 4 minutes from the attached query. However, there are still many more data to be loaded from the database. For the result, I want to achieve a short execution time.
You have many repeated sub-queries. You can improve performance by not repeating them and calculating the values only once in the
JOINclause rather than multiple times in every row in theWHEREclause:For example, by using a
LATERAL JOINwhich is available from Oracle 12 (untested as you provided no sample data or code for the functions you are calling):You can also directly use
MMT.TRANSACTION_DATE(rather thanTRUNC(MMT.TRANSACTION_DATE)) which may allow Oracle to use an index on that column; otherwise you would need to use a function-based index onTRUNC(MMT.TRANSACTION_DATE).