開發基礎——SQL書寫規範
開發基礎——SQL書寫規範1、 語句中出現的所有表名、欄位名全部小寫,系統保留字、內建函數名、Sql保留字大寫。
2、 串連符or、in、and、以及=、=等前後加上一個空格。
3、 對較為複雜的sql語句加上注釋,說明演算法、功能。
注釋風格:注釋單獨成行、放在語句前面。
(1) 應對不易理解的分支條件運算式加註釋;
(2) 對重要的計算應說明其功能;
(3) 過長的函數實現,應將其語句按實現的功能分段加以概括性說明;
(4) 每條SQL語句均應有注釋說明(表名、欄位名)。
(5) 常量及變數注釋時,應注釋被儲存值的含義(必須),合法取值的範圍(可選)
(6) 可採用單行/多行注釋。(-- 或 /* */ 方式)
4、 SQL語句的縮排風格
(1) 一行有多列,超過80個字元時,基於列對齊原則,採用下行縮排
(2) where子句書寫時,每個條件佔一行,語句令起一行時,以保留字或者串連符開始,串連符靠右對齊。
5、 多表串連時,使用表的別名來引用列。
6、 供別的檔案或函數調用的函數,絕不應使用全域變數交換資料;
7、 變數令名不能超出ORACLE的限制(30個字元),令名要規範,要用英文令名,從變數上能看到變數的作用,如
g名稱 全域變數
m名稱 局部變數
c名稱 游標
p名稱 參數
8、 尋找資料庫表或視圖時,只能取出確實需要的那些欄位,不要使用*來代替所有列名。要清楚明白地使用列名,而不能使用列的序號。
9、 功能相似的過程和函數,盡量寫到同一個包中,加強管理。
如例(1)
二、 書寫最佳化效能建議
1、避免嵌套串連。例如:A = B and B = C and C = D
2、where條件中盡量減少使用常量比較,改用主機變數
3、系統可能選擇基於規則的最佳化器,所以將結果集返回資料量小的表作為驅動表(from後邊最後一個表)。
4、大量的排序操作影響系統效能,所以盡量減少order by和group by排序操作。
如必須使用排序操作,請遵循如下規則:
(1) 排序盡量建立在有索引的列上。
(2) 如結果集不需唯一,使用union all代替union。
5、索引的使用。
(1) 盡量避免對索引列進行計算。如對索引列計算較多,請提請系統管理員建立函數索引。
(2) 盡量注意比較值與索引列資料類型的一致性。
(3) 對於複合索引,SQL語句必須使用主索引列
(4) 索引中,盡量避免使用NULL。
(5) 對於索引的比較,盡量避免使用NOT=(!=)
(6) 查詢列和排序列與索引列次序保持一致
6、盡量避免相同語句由於書寫格式的不同,而導致多次文法分析,盡量使用Bind變數。
7、盡量使用共用的SQL語句。
8、查詢的Where過濾原則,應使過濾記錄數最多的條件放在最前面。
9、任何對列的操作都將導致表掃描,它包括資料庫函數、計算運算式等等,查詢時要儘可能將操作移至等號右邊。
10、in、or子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。
三、其他經驗性規則
1、盡量少用巢狀查詢。如必須,請用not exist代替not in子句。如例(2)
2、用多表串連代替EXISTS子句。如例(3)
3、少用DISTINCT,用EXISTS代替 如例(4)
4、使用UNION ALL、MINUS、INTERSECT提高效能
5、使用ROWID提高檢索速度。對Select得到的單行記錄,需進行Delete、Update操作時,使用ROWID將會使效率大大提高。
6、使用最佳化線索機制進行訪問路徑控制。
7、使用cursor時,顯示光線標優於隱式游標
本規範樣本:
例一: [code]
Select aka042 -- 單位繳費劃入個人帳戶比例
INTO prm_aaa043
FROM ka01 --醫學保險單位繳費劃入個人帳戶比例分段資訊
Where akc021 = rec_kc01.akc021 -- 醫學人員類別
AND aka041 >= rec_kc01.akc023 -- 年齡上限
AND aka040 = prm_date or aae031 IS NULL ); -- 終止時間
[/code]
例二: [code]
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');
[/code]
例三: [code]
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';
[/code]
例四: [code]
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);
[/code]
注釋範例
過程注釋:
過程都以sp_開頭,注意過程名稱要符合令名要求
/**************************************************************************
name:sp_Write_log
parameter:p_textContext in varchar2 參數描述
create date:2003-04-1
creater:chen jiping
desc:過程總功能描述
****************************************************************************/
函數注釋
函數以f開頭,令名符合令名標準
/**************************************************************************
name:f_Get_JobId
parameter:p_Name in varchar2 參數描述
return number:傳回值描述
create date:2003-04-1
creater:chen jiping
desc:函數總功能描述
****************************************************************************/