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