一、 Sql&PL/SQL書(shū)寫(xiě)規范:
1、 語(yǔ)句中出現的所有表名、字段名全部小寫(xiě),系統保留字、內置函數名、Sql保留字大寫(xiě)。
2、 連接符or、in、and、以及=、<=、>=等前后加上一個(gè)空格。
3、 對較為復雜的sql語(yǔ)句加上注釋?zhuān)f(shuō)明算法、功能。
注釋風(fēng)格:注釋單獨成行、放在語(yǔ)句前面。
(1) 應對不易理解的分支條件表達式加注釋?zhuān)?
(2) 對重要的計算應說(shuō)明其功能;
(3) 過(guò)長(cháng)的函數實(shí)現,應將其語(yǔ)句按實(shí)現的功能分段加以概括性說(shuō)明;
(4) 每條SQL語(yǔ)句均應有注釋說(shuō)明(表名、字段名)。
(5) 常量及變量注釋時(shí),應注釋被保存值的含義(必須),合法取值的范圍(可選)
(6) 可采用單行/多行注釋。(-- 或 /* */ 方式)
4、 SQL語(yǔ)句的縮進(jìn)風(fēng)格
(1) 一行有多列,超過(guò)80個(gè)字符時(shí),基于列對齊原則,采用下行縮進(jìn)
(2) where子句書(shū)寫(xiě)時(shí),每個(gè)條件占一行,語(yǔ)句令起一行時(shí),以保留字或者連接符開(kāi)始,連接符右對齊。
5、 多表連接時(shí),使用表的別名來(lái)引用列。
6、 供別的文件或函數調用的函數,絕不應使用全局變量交換數據;
7、 變量令名不能超出ORACLE的限制(30個(gè)字符),令名要規范,要用英文令名,從變量上能看到變量的作用,如
g名稱(chēng) 全局變量
m名稱(chēng) 局部變量
c名稱(chēng) 光標
p名稱(chēng) 參數
8、 查找數據庫表或視圖時(shí),只能取出確實(shí)需要的那些字段,不要使用*來(lái)代替所有列名。要清楚明白地使用列名,而不能使用列的序號。
9、 功能相似的過(guò)程和函數,盡量寫(xiě)到同一個(gè)包中,加強管理。
如例(1)
二、 書(shū)寫(xiě)優(yōu)化性能建議
1、避免嵌套連接。例如:A = B and B = C and C = D
2、where條件中盡量減少使用常量比較,改用主機變量
3、系統可能選擇基于規則的優(yōu)化器,所以將結果集返回數據量小的表作為驅動(dòng)表(from后邊最后一個(gè)表)。
4、大量的排序操作影響系統性能,所以盡量減少order by和group by排序操作。
如必須使用排序操作,請遵循如下規則:
(1) 排序盡量建立在有索引的列上。
(2) 如結果集不需唯一,使用union all代替union。
5、索引的使用。
(1) 盡量避免對索引列進(jìn)行計算。如對索引列計算較多,請提請系統管理員建立函數索引。
(2) 盡量注意比較值與索引列數據類(lèi)型的一致性。
(3) 對于復合索引,SQL語(yǔ)句必須使用主索引列
(4) 索引中,盡量避免使用NULL。
(5) 對于索引的比較,盡量避免使用NOT=(!=)
(6) 查詢(xún)列和排序列與索引列次序保持一致
6、盡量避免相同語(yǔ)句由于書(shū)寫(xiě)格式的不同,而導致多次語(yǔ)法分析,盡量使用Bind變量。
7、盡量使用共享的SQL語(yǔ)句。
8、查詢(xún)的WHERE過(guò)濾原則,應使過(guò)濾記錄數最多的條件放在最前面。
9、任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢(xún)時(shí)要盡可能將操作移至等號右邊。
10、in、or子句常會(huì )使用工作表,使索引失效;如果不產(chǎn)生大量重復值,可以考慮把子句拆開(kāi);拆開(kāi)的子句中應該包含索引。
三、其他經(jīng)驗性規則
1、盡量少用嵌套查詢(xún)。如必須,請用not exist代替not in子句。如例(2)
2、用多表連接代替EXISTS子句。如例(3)
3、少用DISTINCT,用EXISTS代替 如例(4)
4、使用UNION ALL、MINUS、INTERSECT提高性能
5、使用ROWID提高檢索速度。對SELECT得到的單行記錄,需進(jìn)行DELETE、UPDATE操作時(shí),使用ROWID將會(huì )使效率大大提高。
6、使用優(yōu)化線(xiàn)索機制進(jìn)行訪(fǎng)問(wèn)路徑控制。
7、使用cursor時(shí),顯示光標優(yōu)于隱式光標
本規范示例:
例一:
SELECT aka042 -- 單位繳費劃入個(gè)人帳戶(hù)比例
INTO prm_aaa043
FROM ka01 --醫療保險單位繳費劃入個(gè)人帳戶(hù)比例分段信息
WHERE akc021 = rec_kc01.akc021 -- 醫療人員類(lèi)別
AND aka041 >= rec_kc01.akc023 -- 年齡上限
AND aka040 <= rec_kc01.akc023 -- 年齡下限
AND aae030 <= prm_date -- 開(kāi)始時(shí)間
AND ( aae031 >= prm_date OR aae031 IS NULL ); -- 終止時(shí)間
例二:
X SELECT ......
FROM emp
WHERE dept_no NOT IN ( SELECT dept_no
FROM dept
WHERE dept_cat=‘A‘);
O SELECT ......
FROM emp e
WHERE NOT EXISTS ( SELECT ‘X‘
FROM dept
WHERE dept_no=e.dept_no
AND dept_cat=‘A‘);
例三:
X SELECT ......
FROM emp
WHERE EXISTS ( SELECT ‘X‘
FROM dept
WHERE dept_no=e.dept_no
AND dept_cat=‘A‘);
O SELECT ......
FROM emp e,dept d
WHERE e.dept_no=d.dept_no
AND dept_cat=‘A‘;
例四:
X SELECT DISTINCT d.dept_code,d.dept_name
FROM dept d ,emp e
WHERE e.dept_code=d.dept_code;
O SELECT dept_code,dept_name
FROM dept d
WHERE EXISTS ( SELECT ‘X‘
FROM emp e
WHERE e.dept_code=d.dept_code);
注釋范例
過(guò)程注釋?zhuān)?br>過(guò)程都以sp_開(kāi)頭,注意過(guò)程名稱(chēng)要符合令名要求
/**************************************************************************
name:sp_Write_log
parameter:p_textContext in varchar2 參數描述
create date:2003-04-1
creater:chen jiping
desc:過(guò)程總功能描述
****************************************************************************/
函數注釋
函數以f開(kāi)頭,令名符合令名標準
/**************************************************************************
name:f_Get_JobId
parameter:p_Name in varchar2 參數描述
return number:返回值描述
create date:2003-04-1
creater:chen jiping
desc:函數總功能描述
****************************************************************************/
聯(lián)系客服