Question

  Asked: Nov 18 2005   8:31 AM GMT
  Asked by: WasimAhmed


SQL Query Perfomance Issue.


Oracle, Windows, ERP, Software testing, Automated, Performance/Load, Software Testing Tools

Hi All,
This is Wasim Ahmed. I basically wanted a kick start to tune my SQL Queries for performance.
I have a huge query which is taking an average of 30seconds for records in thousands. I want to improve the efficiency of the Query. Can any one help me in this.
I am pasting my SQL query.
I would be greatfull if you can mail me your personal email id to wase_ahmed@hotmail.com so that i can share my PLSql procedure..
Thank you.
Best Regards
Wasim Ahmed.
SELECT *
FROM (SELECT ohs.ohs_order_no "SOH_ORDER_NO", ohs.cus_code_dlvy "CUS_CODE_DLVY", cus.cus_name "CUS_NAME",
ohs.ohs_doc_ref "SOH_CUSTOMER_DOC_REF",
NVL (TO_CHAR (ohs.ohs_order_date, Agsoracleconstant.l_date_format), ' ') "SOH_CUSTOMER_ORDER_DATE",
ohs.rep_entity_id "REP_ENTITY_ID", ohs.rev_entity_id "REV_ENTITY_ID", ohs.ohs_status "SOH_STATUS",
cm.acm_code_desc "SOH_STATUS_DESCRIPTION", pos.prm_id "PRM_ID", prm.prm_name "PRM_NAME",
ohs.ohs_transaction_type "OHS_TRANSACTION_TYPE", ' ' "ACCESSLEVEL", ods.sup_code "SUP_CODE",
ohs.ohs_order_classification "SOH_ORDER_CLASSIFICATION"
FROM ORDER_HEADER_SCRATCH ohs,
CUSTOMER_MASTER cus,
CODE_MASTER cm,
(SELECT MAX (prm_id) AS prm_id, pos_order_no
FROM PROCESS_ORDER_STATUS
GROUP BY pos_order_no) pos,
PROCESS_MASTER prm,
(SELECT ods.ohs_order_no, ods.sup_code
FROM ORDER_HEADER_SCRATCH ohs, ORDER_DETAIL_SCRATCH ods
WHERE ohs.ohs_order_no(+) = ods.ohs_order_no
AND ohs.ohs_status <> 1
GROUP BY ods.ohs_order_no, ods.sup_code) ods
WHERE ohs.cus_code_dlvy = cus.cus_code
AND ohs.ohs_status LIKE l_orderstatus
AND ohs.ohs_order_no LIKE l_orderno
AND UPPER (ohs.ohs_transaction_type) = 'SO'
AND ohs.ohs_status = cm.acm_code_value
AND cm.acm_code_fldname = 'SO_HEADER_STATUS'
AND ohs.ohs_order_no = pos.pos_order_no(+)
AND prm.prm_id(+) = pos.prm_id
-- Dummy order number to suppress the order when despatch note number is given
AND ohs.ohs_order_no LIKE l_dummyordernumber
-- New Requirment for Simple Search for Sup Code
AND ohs.ohs_order_no = ods.ohs_order_no(+)
AND UPPER (NVL (ods.sup_code, ' ')) LIKE UPPER (l_supcode)
AND ohs.rev_entity_id IN (SELECT t_reventityid
FROM TEMP_REVENTITY)
AND ohs.rep_entity_id IN (SELECT t_repentityid
FROM TEMP_REPENTITY)
AND UPPER (NVL (ohs.cus_code_dlvy, ' ')) LIKE UPPER (l_cuscode)
AND UPPER (NVL (cus.cus_name, ' ')) LIKE UPPER (l_cusname)
AND UPPER (NVL (ohs.ohs_doc_ref, ' ')) LIKE UPPER (l_cusrefno)
AND ( (TO_CHAR (ohs.ohs_order_date, Agsoracleconstant.l_date_format)) >= l_orderdatefrom
AND ohs.ohs_order_date IS NOT NULL
)
AND ( (TO_CHAR (ohs.ohs_order_date, Agsoracleconstant.l_date_format)) <= l_orderdateto
AND ohs.ohs_order_date IS NOT NULL
)
UNION ALL
(SELECT DISTINCT soh.soh_order_no "SOH_ORDER_NO", soh.cus_code_dlvy "CUS_CODE_DLVY", cus.cus_name "CUS_NAME",
soh.soh_customer_doc_ref "SOH_CUSTOMER_DOC_REF",
NVL (TO_CHAR (soh.soh_customer_order_date, Agsoracleconstant.l_date_format),
' '
) "SOH_CUSTOMER_ORDER_DATE",
soh.rep_entity_id_orig "REP_ENTITY_ID", soh.rev_entity_id "REV_ENTITY_ID",
soh.soh_status "SOH_STATUS", cm.acm_code_desc "SOH_STATUS_DESCRIPTION", pos.prm_id "PRM_ID",
prm.prm_name "PRM_NAME", 'SO' "OHS_TRANSACTION_TYPE", ' ' "ACCESSLEVEL", sod.sup_code "SUP_CODE",
soh.soh_order_classification "SOH_ORDER_CLASSIFICATION"
FROM SO_HEADER soh,
CUSTOMER_MASTER cus,
CODE_MASTER cm,
(SELECT MAX (prm_id) AS prm_id, pos_order_no
FROM PROCESS_ORDER_STATUS
GROUP BY pos_order_no) pos,
PROCESS_MASTER prm,
(SELECT sod.soh_order_no, sod.sup_code, sod.rev_entity_id
FROM SO_HEADER soh, SO_DETAIL sod
WHERE soh.soh_order_no(+) = sod.soh_order_no
AND soh.rev_entity_id = sod.rev_entity_id
AND soh.soh_status <> 1
GROUP BY sod.soh_order_no, sod.sup_code, sod.rev_entity_id) sod,
(SELECT pic.soh_order_no, pic_picklist, pic.rev_entity_id
FROM PICKLIST_MASTER pic
WHERE (TO_CHAR (date_last_modified, 'YYYY-MM-DD HH:MI:SS PM')) IN (
SELECT MAX (TO_CHAR (date_last_modified, 'YYYY-MM-DD HH:MI:SS PM'))
FROM PICKLIST_MASTER pic1
WHERE pic1.soh_order_no = pic.soh_order_no
AND pic1.sod_line_number = pic.sod_line_number
AND pic1.rev_entity_id = pic.rev_entity_id
GROUP BY pic1.pic_picklist)
GROUP BY pic.pic_picklist, pic.soh_order_no, pic.rev_entity_id) pic
WHERE soh.cus_code_dlvy = cus.cus_code
AND soh.soh_status LIKE l_orderstatus
AND soh.soh_order_no LIKE l_orderno
AND UPPER (soh.soh_transaction_type) = 'SO'
AND soh.soh_status = cm.acm_code_value
AND cm.acm_code_fldname = 'SO_HEADER_STATUS'
AND soh.soh_order_no = pos.pos_order_no(+)
AND pos.prm_id = prm.prm_id(+)
-- Despatch Note Conditions
AND pic.soh_order_no(+) = sod.soh_order_no
-- New Simple Search change Sup Code
AND soh.soh_order_no = sod.soh_order_no(+)
AND soh.rev_entity_id = sod.rev_entity_id
AND UPPER (NVL (sod.sup_code, ' ')) LIKE UPPER (l_supcode)
AND soh.rev_entity_id IN (SELECT t_reventityid
FROM TEMP_REVENTITY)
AND soh.rep_entity_id_orig IN (SELECT t_repentityid
FROM TEMP_REPENTITY)
AND UPPER (NVL (soh.cus_code_dlvy, ' ')) LIKE UPPER (l_cuscode)
AND UPPER (NVL (cus.cus_name, ' ')) LIKE UPPER (l_cusname)
AND UPPER (NVL (soh.soh_customer_doc_ref, ' ')) LIKE UPPER (l_cusrefno)
-- Despatch note
AND NVL (pic.pic_picklist, ' ') LIKE l_despatchnotenumber
AND ( (TO_CHAR (soh.soh_customer_order_date, Agsoracleconstant.l_date_format)) >= l_orderdatefrom
AND soh.soh_customer_order_date IS NOT NULL
)
AND ( (TO_CHAR (soh.soh_customer_order_date, Agsoracleconstant.l_date_format)) <= l_orderdateto
AND soh.soh_customer_order_date IS NOT NULL
))
ORDER BY soh_order_no)
WHERE ROWNUM < Agsoracleconstant.l_record_count;

Subscribe to Alerts! Get questions and answers delivered to your Inbox.


E-mail me updates on this question



   SUBSCRIBE

hidden modal window

Answer Wiki (Improve, edit or add to this answer)


 RATE THIS ANSWER
0
Click to Vote:
  •   0
  •  0



Wow! This one is just a treasure chest of things that take time. Rather than go through the whole thing, which could take an hour, I'll give you some pointers:

(1) Don't compare using UPPER or NVL unless you have to. Consider NOT NULL fields, field stored in upper case, a second field set up for comparison, or functional indeces, as in CREATE INDEX xxx ON xxx(UPPER(xxx)).

(2) Use = comparison, rather than LIKE, again, unless you have to.

(3) Try to recfactor the lessen the number of subqueries.

(4) Make sure that what you're searching and matching on is indexed. If I want something of the form. A.first=B.first AND A.second=B.second, it's best to have a compound index: CREATE INDEX ON b(first, second)

A complete explanation on how to fix this kind of stuff can be found at:
http://linkersystems.com/ArticlesAndWhitePapers/SQLC.pdf

Shameless plug: Of course, you can have a firm specializing in such things make the changes for you.

---
/s/Sheldon Linker
Linker Systems, Inc.
www.linkersystems.com
sol@linker.com
800-315-1174
+1-949-552-1904 from outside of North America
  • AddThis Social Bookmark Button

Browse more Questions and Answers on Oracle, Microsoft Windows and CIO.

Looking for relevant Oracle Whitepapers? Visit the SearchOracle.com Research Library.


Discuss This Answer


You must be logged-in to discuss a question. Log-in/Register