多個表關聯的sql語句,若是某個關聯的表只取個別字段,則子查詢效率比表關聯高一些。sql
如下的子查詢取部門和職位的描述的寫法,比直接關聯部門和職位表取描述的效率高一些。優化
WITH TMP AS
(SELECT B.EMPLID,
B.EMPL_RCD,
B.setid_dept,
B.DEPTID,
B.HR_STATUS,
B.BUSINESS_UNIT,
B.POSITION_NBR,
B.EFFDT
FROM PS_JOB B
WHERE B.EFFDT = (SELECT MAX(B_ED.EFFDT)
FROM PS_JOB B_ED
WHERE B_ED.EMPLID = B.EMPLID
AND B_ED.EMPL_RCD = B.EMPL_RCD)
AND B.EFFSEQ = (SELECT MAX(B_ES.EFFSEQ)
FROM PS_JOB B_ES
WHERE B_ES.EMPLID = B.EMPLID
AND B_ES.EMPL_RCD = B.EMPL_RCD
AND B_ES.EFFDT = B.EFFDT))
SELECT SEC.OPRID,
A.EMPLID,
B.EMPL_RCD,
A.NAME,
A.NAME_AC,
B.HR_STATUS,
B.BUSINESS_UNIT,
B.DEPTID,
(SELECT C.DESCR
FROM PS_DEPT_TBL C
WHERE C.EFFDT = (SELECT MAX(EFFDT)
FROM PS_DEPT_TBL C_ED
WHERE B.SETID_DEPT = C.SETID
AND B.DEPTID = C.DEPTID
AND C_ED.SETID = C.SETID
AND C_ED.DEPTID = C.DEPTID
AND C_ED.EFFDT <= B.EFFDT)),
B.POSITION_NBR,
(SELECT D.DESCR
FROM PS_POSITION_DATA D
WHERE D.EFFDT = (SELECT MAX(EFFDT)
FROM PS_POSITION_DATA D_ED
WHERE B.POSITION_NBR = D.POSITION_NBR
AND D_ED.POSITION_NBR = D.POSITION_NBR
AND D_ED.EFFDT <= B.EFFDT))
FROM PS_EMPLMT_SRCF_QRY SEC, PS_NAMES A, TMP B
WHERE SEC.EMPLID = B.EMPLID
/* and b.emplid='20130581'*/
AND SEC.EMPL_RCD = B.EMPL_RCD
AND A.EMPLID = B.EMPLID
AND SEC.OPRID = 'PS'
and a.NAME LIKE '郭偉麗%'效率
PLSQL 查看執行計劃sql語句
通常來講正常的優化器邏輯是先過濾數據(filter)而後再關聯統計
統計信息更新會對執行效率有必定的影響數據
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE,
ownname => 'SYSADM',
tabname => 'PS_JOB',
METHOD_OPT => 'for all indexed columns',
DEGREE => DBMS_STATS.DEFAULT_DEGREE,
CASCADE => TRUE);
END;查詢
建立序號用Oracle NEXTVAL filter
:
SQLExec("SELECT TRANSACTION_NBR.NEXTVAL FROM DUAL", &returnValue);
:
CREATE SEQUENCE "SYSADM"."TRANSACTION_NBR" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;tab