[英]Optimize Oracle SQL which has multiple sub-queries
我有一個包含多個子查詢的Oracle SQL查詢。 該查詢提供了正確的數據,但是執行需要15-20分鍾。 閱讀以下鏈接的一些答案后:
我嘗試使用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.