【正文】
NOT EXISTS)通常將提高查詢的效率 . 示例: 低效: SELECT * FROM EMP (基礎(chǔ)表 ) WHERE EMPNO 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC = ?MELB39。) 高效 : SELECT * FROM EMP (基礎(chǔ)表 ) WHERE EMPNO 0 AND EXISTS (SELECT ?X39。 FROM DEPT WHERE = AND LOC = ?MELB39。) 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 用 NOT EXISTS替代 NOT IN: 無(wú)論在哪種情況下 ,NOT IN都是最低效的 (因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷 ).可以把它改寫成外連接 (Outer Joins)或 NOT EXISTS. 示例: SELECT … FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT=39。A39。)。 (方法一 : 高效 ) SELECT …. FROM EMP A,DEPT B WHERE = (+) AND IS NULL AND (+) = ?A39。 (方法二 : 最高效 ) SELECT …. FROM EMP E WHERE NOT EXISTS (SELECT ?X39。 FROM DEPT D WHERE = AND DEPT_CAT = ?A39。)。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 用表連接替換 EXISTS : 通常來(lái)說(shuō) , 采用表連接的方式比 EXISTS更有效率。 SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X39。 FROM DEPT WHERE DEPT_NO = AND DEPT_CAT = ‘A39。)。 (更高效 ) SELECT ENAME FROM DEPT D,EMP E WHERE = AND DEPT_CAT = ‘A39。 。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 用 EXISTS替換 DISTINCT: 當(dāng)提交一個(gè)包含一對(duì)多表信息 (比如部門表和雇員表 )的查詢時(shí) ,避免在 SELECT子句中使用DISTINCT。一般可以考慮用 EXIST替換。 示例: 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE = 高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X39。 FROM EMP E WHERE = )。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 避免在索引列上使用計(jì)算: WHERE子句中,如果索引列參與計(jì)算,優(yōu)化器將不使用索引而使用全表掃描。 示例: 低效: SELECT … FROM DEPT WHERE SAL * 12 25000。 高效 : SELECT … FROM DEPT WHERE SAL 25000/12。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 避免在索引列上使用 NOT : 避免在索引列上使用 NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響 . 當(dāng) ORACLE?遇到? NOT,會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描。 示例: 低效 : (不使用索引 ) SELECT … FROM DEPT WHERE NOT DEPT_CODE = 0。 高效 : (使用了索引 ) SELECT … FROM DEPT WHERE DEPT_CODE 0。 需要注意的是 ,在某些時(shí)候 , ORACLE優(yōu)化器會(huì)自動(dòng)將 NOT轉(zhuǎn)化成相對(duì)應(yīng)的關(guān)系操作符。 NOT to = NOT = to NOT to = NOT = to 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 性能相關(guān)的建議 建議 用 =替代 : 如果 DEPTNO上有一個(gè)索引 , 高效: SELECT * FROM EMP WHERE DEPTNO =4 低效: SELECT * FROM EMP WHERE DEPTNO 3 兩者的區(qū)別在于 , 前者 DBMS將直接跳到第一個(gè) DEPT等于 4的記錄而后者將首先定位到 DEPTNO=3的記錄并且向前掃描到第一個(gè) DEPT大于 3的記錄。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 提綱 概述 排版規(guī)則 注釋規(guī)則 命名規(guī)范 SQL程序編碼規(guī)則 SQL性能規(guī)則與建議 程序質(zhì)量保證 安全保障 7 程序質(zhì)量保證 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 程序質(zhì)量保證 規(guī)則 運(yùn)行日志: 是指 SQL運(yùn)行點(diǎn)的輸出日志。要求程序一定要使用日志語(yǔ)句,在運(yùn)行過(guò)程輸出。 日志的輸出,可以是數(shù)據(jù)表,或者通過(guò) Java函數(shù),或者 UT_FILE包,書寫到操作系統(tǒng)文件。 運(yùn)行日志必須設(shè)置調(diào)試開(kāi)關(guān),在生產(chǎn)環(huán)境有效屏蔽其在開(kāi)發(fā)測(cè)試環(huán)境輸出的日志。 規(guī)則 錯(cuò)誤日志: 系統(tǒng)容錯(cuò)處理的日志,一定要與運(yùn)行日志分開(kāi)。使用數(shù)據(jù)表時(shí),錯(cuò)誤日志的數(shù)據(jù)表與運(yùn)行日志表不同; 使用操作系統(tǒng)文件時(shí),錯(cuò)誤日志文件名與運(yùn)行日志文件名不同。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 程序質(zhì)量保證 規(guī)則 工作日志: 系統(tǒng)關(guān)鍵性的 SQL執(zhí)行情況,應(yīng)包括語(yǔ)句、記錄數(shù)等的日志,便于程序上線后維護(hù)。 規(guī)則 錯(cuò)誤日志: SQL程序,一定使用 BEGIN/EXCEPTION/END代碼塊,進(jìn)行錯(cuò)誤捕獲,并輸出錯(cuò)誤日志。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) 提綱 概述 排版規(guī)則 注釋規(guī)則 命名規(guī)范 SQL程序編碼規(guī)則 SQL性能規(guī)則與建議 程序質(zhì)量保證 安全保障 8 安全保障 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn) PL/SQL安全 規(guī)則 DML/DDL語(yǔ)句需說(shuō)明功能和要求: Insert/delete/update語(yǔ)句以及腳本中的 CREATE/DROP/ALTER命令,應(yīng)添加注釋說(shuō)明其功能和要求。 規(guī)則 游標(biāo)使用結(jié)束后必須關(guān)閉。 規(guī)則 PROC程序中禁止出現(xiàn)用戶名和密碼 規(guī)則 DML/DDL操作應(yīng)顯式寫明對(duì)象屬主 數(shù)據(jù)庫(kù)的表應(yīng)用,獨(dú)立的存儲(chǔ)過(guò)程,獨(dú)立的函數(shù),或者處理包的開(kāi)頭,帶上明確的數(shù)據(jù)對(duì)象屬主,以避免誤操作。 例如: , CREATE OR REPLACE PACKAGE AS BEGIN END。 6Feb22 神州數(shù)碼思特奇公司基礎(chǔ)工程師系列培訓(xùn)