- 相關推薦
oracle數據庫開發規范具體條件
編程規范
1:所有數據庫關鍵字和保留字都大寫;字段、變量的大小寫
2:程序塊采用縮進風格書寫,保證代碼清晰易讀,風格一致,縮進格數統一為2/4個。
必須使用空格,不允許使用【tab】鍵。
3:當同一條語句暫用多于一行時,每行的其他關鍵字與第一行的關鍵字進行右對齊。
4:不允許多個語句寫到一行,即一行只寫一條語句。
5:避免把復雜的SQL語句寫到同一行,建議要在關鍵字和謂詞處換行。
6:相對獨立的程序塊之間必須加空行。BEGIN、END獨立成行。
7:太長的表達式應在低優先級操作符處換行,操作符或關鍵字應放在新行之首。不同類型的操作符混合使用時,用括號隔離,使得代碼清晰。
8: 不同類型的操作符混合使用時,應使用括號明確的表達運算的先后關系。
9:運算符以及比較符左邊或者右邊只要不是鏈接的括弧,則空一格。
10:if 后的條件要用括號括起來,括號內每行最多兩個條件。
11:減少控制語句的檢查次數,如在 else( if..else)控制語句中,對最常用符合條件,盡量往前被檢查到。盡量避免使用嵌套的if 語句,在這種情況應使用多個if 語句來判斷其可能。
命名規范
1:不使用數據庫關鍵字和保留字,為了避免不必要的沖突和麻煩。
2:嚴禁使用帶空格的名稱來給字段和表命名,會出錯誤而終止。
3:用戶自定義數據庫對象:表,視圖,主外鍵,索引,觸發器,函數,存儲過程,序列,同義詞,數據庫連接,包,包體風格要保持一致。
數據庫名稱1-8個字符,其他對象1-30個字符,數據庫連接不操過30個字符。使用英文字母、數字、下劃線。
除表外,其他對象命名最好用不同的前綴來區別。
表 tbl_/t_
視圖 v_
序列 seq_
簇 c_
觸發器 trg_
存儲過程 sp_/p_
函數 f_/fn_
物化視圖 mv_
包和包體 pkg_
類和類體 typ_
主鍵 pk_
外鍵 fk_
唯一索引 uk_
普通索引 idx_
位圖索引 bk_
4:PL/SQL對象和變量命名規則
輸入變量 i_
輸出變量 o_
輸入輸出變量 io_
普通變量 v_
全局變量 gv_
常量 大寫
游標 cur_
用戶自定義類型 type_
保存點 spt_
不允許使用中文和特殊字符
用戶對象命名應全部為小寫,且不允許使用控制符號強制轉換對象為小寫字符
變量命名,要有具體含義,能表明變量類型。
5:注釋規范
源程序有效注釋量必須在30%左右。
統一文件頭的注釋,針對存儲過程,函數進行功能性描述,入出參數說明。
/*******************************************************************
名稱:
功能描述:
修訂記錄
版本號 編輯時間 編輯人 修改描述
入出參數說明
返回值描述(針對函數)
*******************************************************************/
所有變量定義需要添加注釋,說明該變量的用途和含義。
程序分支必須書寫注釋,這些語句是程序實現某一特定功能的關鍵。
在程序塊的結束行加注釋,表明程序塊結束。
注釋應與描述的代碼相似,對代碼的注釋應在其上方或右方現今為止,不能放在下面。
禁止在注釋中使用縮寫,特別是非常用的縮寫。
注釋要與描述的內容進行相同的縮排。
注釋上面的代碼應空行隔開。
注釋用中文書寫。
盡量使用”--” 進行注注釋。
行尾注釋須使用”--” 。
6:分區表命名
分區表的表名可以遵循普通表的正常命名規則。主要用途的縮寫+下劃線+yymm。
按地域分布的子公司庫存表( 每個區域一個分區),分區名這為表的主要用途的縮寫+區域的縮寫。
最小分區名字為before_data 規則3.4.5:最大分區名字為after_data 規則3.4.5:子分區的名字為:父分區名+下劃線+sub+ 下劃線+no( 區域縮寫),根據實際情況進行組合。
分區表本地索引命名在正常索引名的最后一個下劃線前加L。
分區表全局索引命名在正常索引名的最后一個下劃線前加G。
DML操作規范
1:減少控制語句的檢查次數,應將最常用的符合條件前置以便被檢查到。
2:避免使用 SELECT *語句,給出字段列表,避免出現在表結構變化時程序無法識別的情況。
3:INSERT 語句必須給出字段列表,避免在表結構變化時發生編譯錯誤。
4:從表中同一筆記錄中獲取記錄的字段值,須使用一SQL 語句得到,不允許分多條SQL 語句。
5:當一個PL/SQL 或SQL 語句中涉及到多個表時,始終使用別名來限定字段名,這使其它人閱讀起來更方便,避免了含議模糊的引用,其中能夠別名中清晰地判斷出表名。
6:禁止進行字段數據類型的隱式轉換,所有轉換必須進行明確的數據類型轉換
說明:隱式轉換會導致字段上的索引失效,而進行顯式轉換,會提醒到開發人員該種操作會導致索引失效
7:禁止在多表關聯的時候,在非索引字段上的關聯;
8:進行模糊查詢時,禁止條件中字符串直接以“%”開頭;
9:盡量使用DECODE來簡化SQL訪問數據庫的次數
10:避免使用HAVING子句, HAVING 只會在檢索出所有記錄之后才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.
11:當PL/SQL或SQL語句中涉及多個表時,始終使用別名來限定表名和字段名。
12:確保變量和參數在類型和長度上與表數據列相匹配,否則較寬或較大數據進來時會異常。
13:使用EXISTS/NOT EXISTS替代IN/NOT IN
14:采用表連接替代EXIST
15:復雜的SQL是否由設計不當引起,復雜的SQL考慮用程序塊來執行。
處理的優先級
靜態SQL>動態SQL
綁定變量的SQL>動態SQL
SQL>PL/SQL過程
SQL>游標遍歷
ORACLE函數>自定義函數
16: 使用ORACLE分析函數來代替同一表多次的關聯。
17: 使用動態SQL時要綁定變量。
18:不要把空的變量直接與比較運算符比較,如果結果可能為空,應使用IS NULL貨IS NOT NULL 或NVL函數進行比較。
19:order by 后面字段不唯一時分頁會出現問題,分頁時如果order by 后面的字段不唯一,一定要讓order by 唯一,最佳方案是增加一pk,如實在沒辦法則可以追加rowid,order by 后盡量避免使用rowid。
20:聚集函數max、min、sum 在沒有記錄得符合查詢條件的情況下返回null,不會產生no_data_found 異常。
21:避免頻繁commit,尤其是把commit 寫在循環體中每次循環都進行commit。
22:使用綁定變量,避免常量的直接引用。
23:避免不必要的排序
24:對于數字型的唯一鍵值,用序列sequence 產生。
25:索引的規則:
建立索引常用的原則如下:
1)、表的主鍵、外鍵必須有索引
2)、數據量超過1000 行的表應該有索引
3)、經常與其它表進行連接的表,在邊接字段上應建立索引
4)、經常出現在where 子句中的字段且過濾性極強的,特別是大表的字段,應該建立索引
5)、索引字段,盡量避免值為null
6)、復合索引的建立需要仔細分析; 盡量考慮用單字段索引代替;
A. 正確選擇復合索引中的第一個字段,一般是選擇性較好的且在where 子句中常的字段上;
B. 復合索引的幾個字段是否經常同時以and 方式出現在where 子句中? 單字段查詢是否極少其至沒有? 如果是,則可以建立復合索引; 否則考慮單字段索引;
C. 如果復合索引中包含的字段經常單獨出現在where 子句中,則分解為多個單字段索引;
D. 如果復合索引所包含的字段超過3 個,那么仔細考慮其必要性,考慮減少復合的字段;
E. 如果既有單字段索引,又有這幾個字段上的復合索引,一般可以刪除復合索引;
7). 頻繁DDL 的表,不要建立太多的索引;
8). 刪除無用的索引,避免對執行計劃造成負面影響;讓SQL 語句用上合理的索引。
合理讓SQL 語句使用索引的原則如下:
首先,看是否用上了索引,對于該使用索引而沒有用上索引的SQL 語句,應該想辦法用上索引。
其次,看是否用上了索引,特別復雜的SQL 語句,當其中where 子句包含多個帶有索引的字段時,更應該注意索引的選擇是否合理。錯誤的索引不僅不會帶來性能的提高,相反往往導致性能的降低。
26:like 子句盡量前端匹配
數據庫設計
1:數據庫設計文檔中,必須包含表數據保留時間;
2:數據庫設計文檔中,必須包含表在最大保留時間下的數據量;
3:數據庫設計文檔中,如果表為分區表,必須包含分區條件;
4:數據庫設計文檔中,必須包含表的讀寫頻率;
5:單SEGMENT (如單個普通表,分區表的單個分區,單個普通索引,分區索引的單個分區)原則上不得超過2GB大小;
6:和其他表有關聯的表,和其他表功能一致的字段類型以及長度,盡量使用相同的列名;
7:禁止依靠設計數據庫表之間的主外鍵關系來保證數據一致性;
8:需要UPDATE的字段,不得設計為分區條件字段;
9:如無特別需要,原則上,字符類型選擇變長字段,數字類型選擇NUMBER;
10:如無特別需要,原則上不得設定表的并發度,壓縮等屬性;
11:無特別說明,每個表的索引,不得超過5個;單字段上的索引不得超過2個;(即一個單字段最多可在上面建立一個單字段索引和一個組合索引包含這個字段);復合索引原則上不得超過3個字段;
12:原則上,分區表的索引必須是分區索引;
13:頻繁出現在where字句里的字段建議建立索引;
14:用來和其他表關聯的字段建議建立索引;
15:索引字段建議有高的選擇性和過濾性(count(distinctid)/count(*)>0.6);
16:在where子句里作為函數參數的字段,不能創建索引,不建議建立函數索引;
17:建立索引的時候,建議考慮到SELECT和INSERT,UPDATE,DELETE的平衡;
18:一般建議在查詢數據量10%以下使用索引;
19:WHERE子句的查詢條件構成索引字段前導字段;選擇性更高的字段放在組合字段索引的前導字段;如果字段選擇性接近,則把頻繁查詢的字段放在前面;如果字段查詢頻率相同,則把表中的數據的排列順序所依據的字段放在前面;
20:進行GROUP BY或者是ORDER BY的字段應在組合字段索引的前導字段;
21:所有序列應設置CACHE值為不低于100
22:如果要求獲得的字段具有強連續和強排序性,則不適宜使用序列
23:視圖中不允許出現ORDER BY排序
24:基于多表關聯的視圖,必須在字段名前指定表別名;視圖的基礎數據盡量從表中獲取,盡量不要嵌套視圖
25:存儲過程,必須有異常捕獲代碼
在存儲過程中變量的聲明集中在AS和BEGIN中完成,不允許在代碼中隨意定義變量。完成相同功能模塊的變量放在一起,不同模塊一空行隔開。
存儲過程中嚴禁使用GOTO語句進行跳轉
有循環更新的存儲過程,必須進行批量提交,且必須進行事務控制
存儲過程中如果打開了dblink,則在存儲過程正;蛘弋惓M顺霰仨氷P閉所有打開的dblink
存儲過程中如果使用了游標,則在存儲過程正;蛘弋惓M顺霰仨氷P閉所有打開的游標
存儲過程中如果有更新,必須在異常捕獲代碼中做回退操作。
異常處理時,把收集機到的錯誤信息計入錯誤日志表。
pl/sql 使用短路徑法,當計算邏輯表達式,即:一旦確定后,pl/sql 停止計算表達式。
26:函數中,如果進行了事務處理,必須有異常捕獲代碼
函數盡量只是實現復雜的計算功能,不對數據庫進行更新操作
27:一次UPDATE多個字段的時候,應一次查詢完成
腳本規范
1:腳本按分類或內容分開存放,按下列順序存儲
1:創建數據庫表空間、用戶文件腳本。
2:創建數據庫角色、用戶腳本。
3:創建數據類型腳本、自定義的數據類型。
4:創建業務表腳本。
5:創建臨時表腳本。
6:創建視圖腳本。
7:創建主外鍵腳本。
8:創建索引腳本。
9:創建觸發器腳本。
10:創建函數、存儲過程腳本。
11:初始化數據腳本。
12:創建作業腳本。
2:創建每個對象代碼的首部應該有對象注釋。
3:函數,存儲過程應單獨創建腳本,在相應目錄下,創建一個運行所有腳本的總腳本。
技巧
1:觸發器盡量考慮內部代碼過程封裝,用過程封裝sql,減少解析次數。
create or replace procedure p_test_tri(p_deptno in number)
as
begin
insert into test_tri_tab2 (deptno,cnt) values (p_deptno,1);
end;
/
create or replace trigger test_tab2_trigger
after insert on test_tri_tab1
for each row
begin
p_test_tri(:new.deptno);
end test_tri_tab2_trigger;
/
2:避免動態sql,動態sql在執行過程中變異,普通sql在過程執行前就已經編譯過了 。等價靜態語句替換動態sql
3:OLTP系統盡量使用綁定變量,sql在shared_pool中介西完成邏輯優化,物理優化,生成計劃等一系列動作
select x from t where x=:x;
4:減少對sysdate,mod的調用,避免sql中的函數調用,大量遞歸調用影響性能?梢愿挠帽黻P聯來代替函數調用。函數調用有代價。
5:設法減少表掃描次數
6:盡量使用簡單sql來代替PL-SQL邏輯
7:避免不必要的排序
1)確認order by 是否多余
2)union是否可以被union all替代
3)不可避免排序,要降低開銷,降序索引
8:使用pls_integer類型
變量時整數型可使用。內部算法改進可提高性能。
9:避免數據類型轉換,隱式類型轉換
1)在insert和update語句中,oracle將賦值的類型轉換為目標列的類型。sysdate根據參數NLS_DATE_FORMAT和NLS_DATE_LANGUAGE轉換為字符
2)SELECT中,oracle會將查詢到的數據類型自動轉換為目標變量的類型。
3)對數值類型的操作,oracle經常調整其精度precision和刻度scale,允許最大容量。
4)當比較字符和數值的時候,數值有更高的優先級,講字符轉化為數值進行比較。
5)字符類型(可轉換成數值),number類型與浮點數類型轉換,可能會丟失精度,數值和number以十進制表示數字,浮點數以二進制表示。
6)講clob轉換為字符類型(varchar2),獲獎blob轉換成raw類型的時候,被轉換的類型長度長的話,會出錯。
7)binary_float自動轉換為binary_double是準確的,反之不準確。binary_double>binary_float>number
8)字符串與date類型比較,date具有較高優先級,將字符串轉化為date類型,需要上下文的支持。
9)當使用sql函數或操作符時候,傳入類型和實際接收的類型不一致,會將傳入的類型根據需要轉化為一致。
10)賦值運算=的時候,oracle會將右邊被賦值的類型轉化為何左邊類型一致的類型。
11)在做連接操作的時候,oracle會將飛字符類型轉化為字符類型,根據上下文轉換。
12)在字符和非字符之間的算術和比較運算中,oracle會將字符轉換成日期,rowid、數值類性,算術操作轉化為數值,rowid比較的將字符轉化為rowid,日期比較的轉化為日期類型。
13)字符類型將的類型轉換,char,varchar,nchar,nvaechar2,nchar和nvarchar2需要國家字符集utf8和al16utf16的支持,按字符存儲的。char,varchar2手數據庫默認字符機支持
14)sql字符函數可以接受clob類型,substr,instr,對不接受clob類型的自動轉換為字符類型
15)空格
10:if的順序,入參越是頻繁調用的值,對應的if邏輯越需要靠前,條件靠前可以減少判斷的次數。
11:設計開發對列是否為空慎重決定,null會影響oracle的執行計劃。索引能回答問題時,非空索引能用上全索引掃描提高性能。
空索引會導致count(*)記錄出錯
索引列不可能為空,不要加is not null的check
Not in查詢中,空值會限制unnest轉換,導致優化器無法選擇anti算法,走抵消的filter
Oracle 如果是not exists或exists和類似group by子句連用,cbo不做查詢轉換,會慢,改成not in或in
12:不要對列運算
Select * from a where trunk(log_time)=to_date(‘2013-09-01’,’yyyy-mm-dd’);
分析執行計劃
一般,每獲取一行開銷5個以下的邏輯讀是接收的范圍
Sql>set autotrace traceonly
Sql>sql clause
關注: consistent gets
Rows processed
聚合函數sum,count以返回的記錄數量為rows processed
使用鎖定
1:執行DML前,先執行 SELECT+ FOR UPDATE NOWAIT來判斷自己能否加上鎖。
2:在select+for update nowait失敗后,立即退出不執行后續更新語句,通過自定義異常來讓后面的語句不執行,在for update加不上鎖就退出,ooo4異常單獨捕獲。
3:對插入為遇到重復記錄就插,重復不插。Dup_val_on_index異常來實現
4:獲取機器ip,終端號,sid等信息
select userenv(‘sessionid’) from dual;
select userenv(‘terminal’) ) from dual;
select Sys_context(‘userenv’,’ip_aaddress’) ) from dual;
select Sys_context(‘userenv’,’current_user’) ) from dual;
select sid from v$mystat where rownum=1;
【oracle數據庫開發規范具體條件】相關文章:
Oracle數據庫SELECT語句03-27
oracle數據庫基本語句02-08
Oracle數據庫語句大全12-21
Oracle數據庫認證層次03-09
Oracle數據庫基本知識03-31
ORACLE數據庫操作基本語句03-06
oracle數據庫培訓課程大綱03-21
oracle數據庫基礎知識01-21
Oracle 數據庫查詢小技巧03-21