【正文】
項目一部數(shù)據(jù)庫開發(fā)規(guī)范版本號日期修改者說 明20120306注:對該文件內(nèi)容增加、刪除或修改均需填寫此變更記錄,詳細(xì)記載變更信息,以保證其可追溯性。1. 命名規(guī)范. 對象新建的表,存儲過程,包等要遵循以下規(guī)則對象名稱前綴備注表見下表,根據(jù)功能分視圖v_主鍵pk_索引idx_序列seq_存儲過程pr_包pk_函數(shù)f_同義詞s_數(shù)據(jù)庫連接(dblink)dl_. 表表名不得超過30個字母,全部采用大寫字母,表的命名可以如下:模塊縮寫名_表的名稱,如RES_NODE代表資源模塊的節(jié)點(diǎn)。 值班: DUTY_CALENDAR。. 字段名稱字段名不得超過30個字母,必須以英文單詞構(gòu)成,每個單詞之間以下劃線隔開,全部采用大寫字母。對復(fù)雜的大型應(yīng)用系統(tǒng)而言,必須建立表名和字段名的數(shù)據(jù)字典,并附于開發(fā)規(guī)范附錄中,在命名時必須嚴(yán)格遵守數(shù)據(jù)字典。2. 數(shù)據(jù)庫對象管理. 一般規(guī)定數(shù)據(jù)庫所有對象,包括表、視圖、主鍵、索引、序列、存儲過程、包等必須在數(shù)據(jù)庫建模工具中進(jìn)行管理并保持與數(shù)據(jù)庫完全同步。. 大小寫在數(shù)據(jù)庫模型、數(shù)據(jù)庫腳本中,所有對象,包括表、視圖、主鍵、索引、序列、存儲過程、包等名稱必須大寫。3. 語句書寫規(guī)范. 盡量不使用某種數(shù)據(jù)庫的特有功能為了保持可移植性,盡量不使用某種數(shù)據(jù)庫的特有功能,如SQL Server專用的Unique ID, Oracle專用的Sequence的功能;. 查詢sql語句盡量使用綁定變量. 盡最大可能不使用通配符在SQL語句中,LIKE關(guān)鍵字支持通配符匹配,但這種匹配特別耗費(fèi)時間。如:SELECT A FROM ABC WHERE A LIKE 39。M%39。 。在A字段上建立了索引。把語句改為SELECT A FROM ABC WHERE A 39。M39。 AND A 39。N39。,在執(zhí)行查詢時會利用索引以提高響應(yīng)速度。使用*通配符必須事先征得項目開發(fā)負(fù)責(zé)人同意。123 Distinct使用distinct會增加查詢和I/O的操作次數(shù)。應(yīng)當(dāng)避免使用distinct關(guān)鍵字。 嵌套查詢SELECT A FROM CMS_USER WHERE USER_NAME IN ( SELECT USER_NAME FROM CMS_DEPARTMENT WHERE DEPARTMENT=’電子辦’)如果我們用連接來代替,且表關(guān)聯(lián)放在條件語句的最后部。即:SELECT A FROM CMS_USER,CMS_DEPARTMENT WHERE CMS_DEPARTMENT .DEPARTMENT=’電子辦’ AND CMS_DEPARTMENT .USER_NAME = 將提高一定的效率。查詢嵌套層次越多,效率越低。應(yīng)當(dāng)盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過濾掉盡可能多的行。 排序利用索引自動以適當(dāng)?shù)拇涡蜉敵鰰r,可以避免對表中數(shù)據(jù)排序,當(dāng)以下的情況發(fā)生時,排序就不能省略: 216。 索引中不包括一個或幾個待排序的列;216。 group by或order by子句中列的次序與索引的次序不一樣;216。 排序的列來自不同的表。正確地增建索引、合理地合并數(shù)據(jù)庫表,可以避免不必要的排序。如果排序不可避免,那么應(yīng)當(dāng)試圖簡化它,如縮小排序列的范圍等。 UNION如果不過濾多表中的重復(fù)數(shù)據(jù),請使用UNION ALL;如果過濾多表中的重復(fù)數(shù)據(jù),請使用UNION。 長語句避免使用很長、很復(fù)雜的查詢語句,如果有特殊需求必須書寫較長的SQL語句,應(yīng)該把語句分解成若干部分,每一部分形成一個存儲過程或函數(shù)。 大表盡可能使用分區(qū)大表分區(qū):超過1G的表盡可能使用分區(qū),分區(qū)的原則和盡可能和維護(hù)該表的機(jī)制結(jié)合起來。比如:保留10天數(shù)據(jù),每天刪除10天前的一天數(shù)據(jù),在刪除數(shù)據(jù)的時候,可以采用采用alter table table_name truncate partition partition_name,而后alter table table_name drop partition partition_name。這里不直接使用drop的原因是減小數(shù)據(jù)庫的開銷。Truncate 是在秒的級別中完成。 其他注意事項1) 在條件語句中,如 Where = 中將記錄少的表放在等號的前部。表關(guān)聯(lián)條件放在語句的最后部。2) 不使用容易與系統(tǒng)關(guān)鍵字重復(fù)的單詞來命名,如ID,DATE等,但可以使用如NODEID,BUYDATE等可以來命名;3) SQL語句用大寫字母(字段中的內(nèi)容除外); 4) 編寫ddl和dml時,每個語句后面必須加上分號;5) 對于定期增加性的性能數(shù)據(jù)表,必須建立有效的索引;6) 查詢語句的Where語句必須落在索引上。4 高效的sql語句 Sql優(yōu)化方法RBO(rulebased optimizer)CBO 驅(qū)動表1)