簡體   English   中英

優化具有多個子查詢的Oracle SQL

[英]Optimize Oracle SQL which has multiple sub-queries

我有一個包含多個子查詢的Oracle SQL查詢。 該查詢提供了正確的數據,但是執行需要15-20分鍾。 閱讀以下鏈接的一些答案后:

  1. https://dba.stackexchange.com/questions/19605/forcing-oracle-to-use-hash-join-for-a-subquery
  2. 優化子查詢的性能

我嘗試使用GLOBAL TEMPORARY TABLE優化查詢,但似乎我沒有CREATE命令的特權。

我想問問你們是否有人知道任何工具或技術可以優化下面的查詢性能:

該查詢用於生成每個校園和課程的錄取編號。

SELECT DISTINCT STVCAMP_DESC "CAMPUS",
STVDEGC_CODE || ' - ' ||STVDEGC_DESC "PROGRAMME",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
) "REC",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A,SARAPPD
WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
AND SARAPPD_PIDM = SARADAP_PIDM
AND SARAPPD_APPL_NO = SARADAP_APPL_NO
AND SARAPPD_APDC_CODE = 'AD'
AND SARAPPD_SEQ_NO = (SELECT 
                        MAX(SARAPPD_SEQ_NO) 
                        FROM SARAPPD 
                        WHERE SARAPPD_PIDM = SARADAP_PIDM 
                        AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                        AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                        AND SARAPPD_APDC_CODE = 'AD'
                    )
AND SARADAP_CAMP_CODE = STVCAMP_CODE
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')) "TOTAL ADMITTED",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A,SARAPPD
WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
AND SARAPPD_PIDM = SARADAP_PIDM
AND SARAPPD_APPL_NO = SARADAP_APPL_NO
AND SARAPPD_APDC_CODE = 'AD'
AND SARAPPD_SEQ_NO = (SELECT 
                        MAX(SARAPPD_SEQ_NO) 
                        FROM SARAPPD 
                        WHERE SARAPPD_PIDM = SARADAP_PIDM 
                        AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                        AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                        AND SARAPPD_APDC_CODE = 'AD'
                    )
AND SARADAP_CAMP_CODE = STVCAMP_CODE 
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND SARADAP_ADMT_CODE = '01'

AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')) "NEWLY ADMITTED",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A,SARAPPD
WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
AND SARAPPD_PIDM = SARADAP_PIDM
AND SARAPPD_APPL_NO = SARADAP_APPL_NO
AND SARAPPD_APDC_CODE = 'AD'
AND SARAPPD_SEQ_NO = (SELECT 
                        MAX(SARAPPD_SEQ_NO) 
                        FROM SARAPPD 
                        WHERE SARAPPD_PIDM = SARADAP_PIDM 
                        AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                        AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                        AND SARAPPD_APDC_CODE = 'AD'
                    )
AND SARADAP_CAMP_CODE = STVCAMP_CODE
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND SARADAP_ADMT_CODE = '03'

AND TO_DATE(TO_CHAR(SARAPPD_APDC_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')) "ADMITTED RESUMING",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'H'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "HOLD",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'I'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "INCOMPLETE",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'P'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "PENDING USP RESULTS",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'W'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "COUNSELLING REQUIRED",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'C'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "AWAITING ASSESSMENT",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A
WHERE A.SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND A.SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(A.SARADAP_APPL_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')
AND SARADAP_APST_CODE = 'D'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND NOT EXISTS (SELECT SARADAP_PIDM FROM SARADAP B,SARAPPD D
                    WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
                    AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
                    AND SARAPPD_PIDM = SARADAP_PIDM
                    AND SARAPPD_APPL_NO = SARADAP_APPL_NO
                    AND SARAPPD_APDC_CODE = 'AD'
                    AND SARAPPD_SEQ_NO = (SELECT 
                                            MAX(SARAPPD_SEQ_NO) 
                                            FROM SARAPPD 
                                            WHERE SARAPPD_PIDM = SARADAP_PIDM 
                                            AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                                            AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                                            AND SARAPPD_APDC_CODE = 'AD'
                                        )
                    AND B.SARADAP_PIDM = A.SARADAP_PIDM
                    AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY'))
) "DECISION MADE-NOT AD",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A,SARAPPD
WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
AND SARAPPD_PIDM = SARADAP_PIDM
AND SARAPPD_APPL_NO = SARADAP_APPL_NO
AND SARAPPD_APDC_CODE = 'U3'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND SARAPPD_SEQ_NO = (SELECT 
                        MAX(SARAPPD_SEQ_NO) 
                        FROM SARAPPD 
                        WHERE SARAPPD_PIDM = SARADAP_PIDM 
                        AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                        AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                        AND SARAPPD_APDC_CODE = 'U3'
                    )
AND SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')) "REJECTED",

(SELECT COUNT(DISTINCT SARADAP_PIDM) FROM SARADAP A,SARAPPD
WHERE SARADAP_TERM_CODE_ENTRY LIKE :TERM
AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY
AND SARAPPD_PIDM = SARADAP_PIDM
AND SARAPPD_APPL_NO = SARADAP_APPL_NO
AND SARAPPD_APDC_CODE = 'L2'
AND A.SARADAP_DEGC_CODE_1 = STVDEGC_CODE
AND SARAPPD_SEQ_NO = (SELECT 
                        MAX(SARAPPD_SEQ_NO) 
                        FROM SARAPPD 
                        WHERE SARAPPD_PIDM = SARADAP_PIDM 
                        AND SARAPPD_TERM_CODE_ENTRY = SARADAP_TERM_CODE_ENTRY 
                        AND SARAPPD_APPL_NO = SARADAP_APPL_NO 
                        AND SARAPPD_APDC_CODE = 'L2'
                    )
AND SARADAP_CAMP_CODE = STVCAMP_CODE
AND TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY') <= TO_DATE(TO_CHAR (SYSDATE,'DD/MM/')||:YEAR,'DD/MM/YYYY')) "OL GENERATED"

FROM STVCAMP,STVDEGC,
(SELECT DISTINCT SARADAP_DEGC_CODE_1 FROM SARADAP A WHERE A.SARADAP_TERM_CODE_ENTRY = 201403 ) PROG
WHERE STVCAMP_CODE NOT IN ('X','F','P','W')

AND STVDEGC_CODE = PROG.SARADAP_DEGC_CODE_1

ORDER BY 1,2

這些日期轉換立即引起我的注意:

TO_DATE(TO_CHAR(SARAPPD_ACTIVITY_DATE,'DD/MM/YYYY'),'DD/MM/YYYY')

如果這些日期列上有索引,則由於這些轉換,數據庫將無法使用它們。 為什么根本需要它們? 擺脫它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM