版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Q/GDWXXXXX—XXXX目??次目??次 II前??言 IV電力信息化系統(tǒng)關(guān)系數(shù)據(jù)庫(開源部分)第1部分:SQL編碼規(guī)范 11范圍 12規(guī)范性引用文件 13術(shù)語和定義 13.1視圖 13.2普通索引 13.3主鍵索引 13.4觸發(fā)器 23.5存儲過程 24符號、代號和縮略語 25排版規(guī)范 25.1縮進與對齊 25.2空格和換行 25.3空白的使用 35.4大小寫風(fēng)格 35.5語句排版 36注釋規(guī)范 36.1注釋量 36.2注釋位置 46.3對象注釋 46.4文件注釋 46.5過程和函數(shù)注釋 46.6變量及常量注釋 46.7參數(shù)注釋 56.8功能注釋 56.9語句注釋 57命名規(guī)范 57.1對象命名 57.2變量命名 57.3表屬性命名 58語法規(guī)范 78.1簡單函數(shù)或過程 78.2可讀性要求 78.3編程語言中使用SQL 89腳本規(guī)范 89.1注釋編寫 89.2腳本管理 810性能優(yōu)化 910.1使用索引 910.2類型轉(zhuǎn)換 910.3UNION替代OR(適用于索引列) 1010.4TRUNCATE替代DELETE 1010.5WHERE替代HAVING 1010.6EXISTS替代IN 1010.7NOTEXISTS替代NOTIN 1110.8表連接替代EXISTS 1110.9WHERE子句避免在索引列上使用計算 1210.10EXISTS連接替代DISTINCT 1210.11避免在索引列上使用NOT 1210.12>=替代> 1310.13事務(wù)提交COMMIT 1311質(zhì)量保證 1311.1運行日志 1311.2錯誤日志 1311.3工作日志 1311.4異常檢查 1312一致性約束 1312.1一致性考查表 1413常見縮寫字典 1514對象命名特例 17編?制?說?明 20目次 11編制背景 22編制主要原則 23主要工作過程 24標(biāo)準(zhǔn)結(jié)構(gòu)和內(nèi)容說明 25標(biāo)準(zhǔn)水平說明 36標(biāo)準(zhǔn)實施措施說明 3電力信息化系統(tǒng)關(guān)系數(shù)據(jù)庫(開源部分)第1部分:SQL編碼規(guī)范范圍本標(biāo)準(zhǔn)規(guī)定了電力信息化系統(tǒng)SG-RDB-MS關(guān)系數(shù)據(jù)庫(開源部分)的編碼標(biāo)準(zhǔn)規(guī)范,從排版規(guī)范、注釋規(guī)范、命名規(guī)范、語法規(guī)范、腳本規(guī)范、性能優(yōu)化和質(zhì)量保證等幾個方面展開說明,詳細(xì)約定了在編寫SG-RDB-MS關(guān)系數(shù)據(jù)庫SQL程序時應(yīng)遵守的規(guī)則和習(xí)慣。本標(biāo)準(zhǔn)(或本部分或本指導(dǎo)性技術(shù)文件)適用于電力信息化系統(tǒng)SG-RDB-MS關(guān)系數(shù)據(jù)庫(開源部分)SQL編碼規(guī)范要求。規(guī)范性引用文件下列文件對于本文件的應(yīng)用是必不可少的。凡是注日期的引用文件,僅注日期的版本適用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改單)適用于本文件?!禛B/T8567-1988計算機軟件產(chǎn)品開發(fā)文件編制指南》《GB/T9385-1988計算機軟件需求說明編制指南》《GB/T11457-1995軟件工程術(shù)語》《國家電網(wǎng)公司“十二五”信息發(fā)展規(guī)劃》《國家電網(wǎng)公司SG-ERP總體建設(shè)方案》《國家電網(wǎng)公司系統(tǒng)架構(gòu)設(shè)計方法論》《國家電網(wǎng)公司應(yīng)用軟件架構(gòu)設(shè)計規(guī)范》《國家電網(wǎng)公司應(yīng)用集成技術(shù)規(guī)范》《國家電網(wǎng)公司軟硬件目標(biāo)架構(gòu)設(shè)計規(guī)范》《國家電網(wǎng)公司應(yīng)用安全設(shè)計規(guī)范》《關(guān)于印發(fā)國家電網(wǎng)公司2013年信息化建設(shè)實施意見的通知》《關(guān)于印發(fā)國家電網(wǎng)公司2011年信息化建設(shè)實施意見的通知》(國家電網(wǎng)信息〔2011〕218號)《關(guān)于印發(fā)國家電網(wǎng)公司2012年信息化建設(shè)實施意見的通知》(國家電網(wǎng)信通〔2012〕206號)《國家電網(wǎng)公司信息系統(tǒng)上下線管理辦法》(國家電網(wǎng)信息〔2009〕1277號)《國家電網(wǎng)公司信息安全加固實施指南》術(shù)語和定義下列術(shù)語和定義適用于本文件。視圖是一個虛擬表,其內(nèi)容由查詢定義,視圖包含一系列帶有名稱的列和行數(shù)據(jù),并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。普通索引無唯一性限制的索引類型。主鍵索引唯一性限制的索引類型。觸發(fā)器是數(shù)據(jù)庫保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā)。存儲過程是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL語句集,存儲在數(shù)據(jù)庫中,經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(shù)來執(zhí)行它。符號、代號和縮略語下列符號、代號和縮略語適用于本文件。SQLStructuredQueryLanguage結(jié)構(gòu)化查詢語言DDLDataDefinitionLanguage數(shù)據(jù)定義語言DMLDataManipulationLanguage數(shù)據(jù)操作語言DCLDataControlLanguage數(shù)據(jù)控制語言排版規(guī)范縮進與對齊塊內(nèi)縮進原則一個塊下屬的內(nèi)容,從下一行開始,從這個塊的標(biāo)識首字符右移4個空格,從第5個列位置開始。塊關(guān)鍵字對齊原則任何塊的關(guān)鍵字,首字母在列上對齊。即:一個程序塊內(nèi)部,標(biāo)識程序塊的關(guān)鍵字開始語句(IF、FOR和BEGIN)、DO、中間語句(ELSIF、EXCEPTION、ELSE)和結(jié)束語句(ENDIF、ENDLOOP、END),在列位置對齊。SQL語句中的對齊方式用空格對齊??崭窈蛽Q行空格SQL內(nèi)算數(shù)運算符、邏輯運算符連接的兩個元素之間必須用空格分隔。逗號之后必須接一個空格。關(guān)鍵字、保留字和左括號之間必須有一個空格。換行一行最長不能超過80字符。當(dāng)超過時,以語意為單位,進行斷行,且斷行后的內(nèi)容,縮進書寫。【示例】:--創(chuàng)建匯總基礎(chǔ)表Create_BaseDat--p_BaseSQLinvarchar(50)--SQL語句--p_sResultTBLinvarcha(50)--結(jié)果輸出數(shù)據(jù)表--p_sInfoStrinvarchar(50)--提示信息返回值:<0,出錯;=0,無記錄;>0記錄數(shù)FunctionCReate_BaseData(inp_BaseSQLvarchar(50),inp_sResultTBLvarchar(50),inp_sInfoStrvarchar(50)RETURNINT;此外,避免將SQL語句寫到同一行,再短的語句也要在關(guān)鍵字和謂詞處換行,例如,SELECT/FROM/WHERE/ORDERBY/GROUPBY等子句必須另起一行寫??瞻椎氖褂孟鄬Κ毩⒌腟QL程序塊之間必須加空行,一般采用1行空行分隔。適當(dāng)時候,可以存在2行空行,但注意不要超過2行(注釋行不在此約定范圍內(nèi))。大小寫風(fēng)格SQL語句中出現(xiàn)的系統(tǒng)保留字、內(nèi)置函數(shù)名、SQL保留字、綁定變量等都應(yīng)大寫。語句排版IF語句IF語句是條件判斷語句,只有一個條件的時候,可以不用圓括號。兩個以上條件的時候,要求用圓括號(),使得邏輯處理明晰。IF/ELSIF/ELSE/ENDIF關(guān)鍵字,每個都獨立占一行。且每行的開始列位置都相同。特別注意,結(jié)束語句ENDIF后面,有分號。編程語言中的SQL語句在JAVA、C#等編程語言中,使用SQL語句應(yīng)遵循以下排版規(guī)則:縮進SQL字符串,不可有縮進,即每一行字符串不可以空格開頭。執(zhí)行SELECT/UPDATE/DELETEFROM/INSERTINTO/VALUES/SET/FROM/WHERE/GROUPBY/ORDERBY/JOIN等關(guān)鍵字單獨占一行;每個查詢字段、條件字段、分組字段、排序字段單獨占一行;SQL文中間不允許出現(xiàn)空行;語句中單引號必須跟所屬的SQL子句處在同一行,連接符("+")必須在行首??崭袼銛?shù)運算符、邏輯運算符連接的兩個元素之間必須用空格分隔;逗號之后必須接一個空格;關(guān)鍵字、保留字和左括號之間必須有一個空格。注釋規(guī)范注釋量程序有效注釋量須在20%以上,注釋的原則是有助于對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準(zhǔn)確、易懂、簡潔。還要注意縮進和對齊,以利閱讀。邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除,注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。避免在注釋中使用縮寫,特別是非常用的縮寫。注釋位置注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面。對象注釋創(chuàng)建每一數(shù)據(jù)庫對象時都要加上COMMENTON注釋,以說明該對象的功能和用途;建表時,對某些數(shù)據(jù)列也要加上COMMENTON注釋,以說明該列和/或列取值的含義。【示例】:comment='普通地區(qū)用戶信息表,用于記錄除成都外的其他地區(qū)的用戶信息,按地區(qū)分區(qū)';comment'用戶編碼,主鍵';文件注釋在每個SQL腳本文件的開頭,要用塊注釋,進行文件功能說明、文件編寫人、聯(lián)系方式和文件創(chuàng)建時間說明等。多行注釋,采用與JAVA或C語言相同的程序注釋符號,即“/**/”。“/*”用于注釋文字的開頭,“*/”用于注釋文字的結(jié)尾,可在程序中標(biāo)識多行文字為注釋。格式:/*注釋內(nèi)容*/。單行注釋,使用注釋符“--”。格式:--注釋內(nèi)容。過程和函數(shù)注釋在每個過程或函數(shù)的開頭,使用塊注釋,進行函數(shù)功能說明,入口出口參數(shù)和返回值說明。【示例】:得到集團用戶外部編碼--@authorluqiang--@version%I%,%G%--@since1.00--@inparamregionCode地市代碼--@inparamamCode業(yè)務(wù)代碼--@outparamgrpUserNo集團用戶編碼--@return返回0表示正確,否則出錯!變量及常量注釋對SQL代碼中的局部變量,重要的,要進行注釋。關(guān)于變量的注釋,采用行尾注釋?!臼纠浚篋ECLAREcurCURSORFORSELECTiFROMtest.t;--定義參考游標(biāo)類型DECLAREf_AreaNameCHAR(16);--最大欠費用戶指標(biāo)所在地區(qū)描述對常量及變量注釋時,應(yīng)注釋被保存值的含義,包括合法取值的范圍。參數(shù)注釋對函數(shù)或過程的每個參數(shù)進行說明。如果取值范圍確定,也一并說明。取值有特定含義的變量(如boolean類型變量),給出每個值的含義。功能注釋對較為復(fù)雜的SQL語句應(yīng)注釋,并說明算法和功能。應(yīng)對不易理解的分支條件表達式加注釋。對重要的計算應(yīng)說明其功能。過長的函數(shù)實現(xiàn),應(yīng)將其語句按實現(xiàn)的功能分段加以概括性說明。語句注釋SQL程序中,盡量對語句采用單行注釋:“--”。這樣,有利于程序調(diào)試時,通過塊注釋方式,實現(xiàn)大段代碼注釋。命名規(guī)范對象命名數(shù)據(jù)庫對象命名范圍:數(shù)據(jù)庫對象,包括表、索引、存儲過程、觸發(fā)器、序列、視圖、同義詞、數(shù)據(jù)鏈路。命名特例參見“章節(jié)14對象命名特例”。命名長度和結(jié)構(gòu)對象名不超過30個字符,不低于6個字符,建議在8-25個左右。由3-5部分構(gòu)成,每部分為有一定含義的英文縮寫或者數(shù)字。每部分建議為3-4個字符。英文縮寫參見“章節(jié)13常見縮寫字典”。此外,不允許出現(xiàn)某省某地市或某項目的簡稱,例如sc_CustInfo中的sc是不許可的。年月日等數(shù)字年月日數(shù)字符號,一般應(yīng)在數(shù)據(jù)表的尾部。不允許將年月日及其它數(shù)字放在對象名的中間。例如,Cust200703Info不許可,CustInfo200703則許可。變量命名全局變量,以g_開頭進行命名;包內(nèi)公用變量,以f_開頭命名;過程局部變量,以v_開頭命名;參數(shù)變量,以p_開頭命名;游標(biāo)變量,以cur_開頭命名。表屬性命名表名表的命名遵循如下的格式:SubSystemName_DetailName以上格式中:SubSystemName是系統(tǒng)功能模塊的簡稱;DetailName與數(shù)據(jù)庫表意義相關(guān)聯(lián)的英文單詞、詞組或其縮寫;單詞中間用下劃線“_”分割;表名稱不能用雙引號包含;總長度必需符合數(shù)據(jù)庫的規(guī)定。例如:檔案管理模塊的采集點信息AM_COLLECT_POINT。存在于生產(chǎn)環(huán)境的非正式表,如備份表,必須以原表名加前綴‘bakyymmdd_’,以便于識別和及時清理。因此,正式生產(chǎn)表中,最好不要出現(xiàn)BAK、BACK之類的字符串。表分區(qū)名表分區(qū)的命名遵循如下的格式:<Part>_DetailName以上格式中:Part是必需的,表示該對象為表分區(qū)號;DetailName是與表分區(qū)名意義相關(guān)聯(lián)的英文單詞、詞組或其縮寫;總長度必需符合數(shù)據(jù)庫的規(guī)定。例如:AM_COLLECT_POINT的分區(qū)Part_2007100101表示該分區(qū)存儲2007100101時段的數(shù)據(jù)。字段名字段的命名遵循如下的格式:<字段的含義>以上格式中:字段名稱必須用字母開頭,采用有特征含義的單詞或縮寫,不能用雙引號包含。同一個字段名在一個數(shù)據(jù)庫中只能代表一個意思。比如TELEPHONE在一個表中代表“電話號碼”的意思,在另外一個表中就不能代表“手機號碼”的意思。不同的表引用相同內(nèi)容的字段應(yīng)該采用同樣的名稱、字段類型定義。總長度必需符合數(shù)據(jù)庫的規(guī)定。主鍵名主鍵的命名遵循如下的格式:PK_TableName以上格式中PK是必需的,表示該對象為附鍵;TableName是數(shù)據(jù)庫的表的名稱或簡寫;總長度必需符合數(shù)據(jù)庫的規(guī)定。外鍵名外鍵的命名遵循如下的格式:FK_TableName1_TableName2_Field1_Field2_…以上格式中:FK是必需的,表示該對象為外鍵;TableName1是數(shù)據(jù)庫的本表的名稱或簡寫;TableName2是數(shù)據(jù)庫的外鍵表的名稱或簡寫;Field1是數(shù)據(jù)庫表中第一個外鍵字段的名稱或名稱簡寫;Field2是數(shù)據(jù)庫表中第二個外鍵字段的名稱或名稱簡寫;去掉每一個表名和字段名自己的下劃線“_”;總長度必需符合數(shù)據(jù)庫的規(guī)定。用戶與角色數(shù)據(jù)庫用戶采用一個代表系統(tǒng)名稱含義的英文單詞或者拼音首字母進行命名,無前綴。創(chuàng)建數(shù)據(jù)庫用戶時一般不要授予DBA權(quán)限。用戶命名遵循如下的格式:系統(tǒng)名稱+_+USER+_+名詞(或縮寫)或名詞短語(或縮寫)語法規(guī)范簡單函數(shù)或過程單一功能函數(shù)或過程(以含注釋在內(nèi),不超過100行就能解決問題為標(biāo)準(zhǔn)),約定采用獨立過程或函數(shù)來實現(xiàn)?!臼纠浚?-是否是一個有效的數(shù)值--參數(shù):--p_NumStrinvarchar(50)--字符型數(shù)字串--返回值:--如果是數(shù)值,返回true;否則返回falseCREATEFunctionRasInfo.IsNumber(inp_NumStrvarchar(50))returnbooleanASDECLARE
v_Numint; BEGINIFISNULL(p_NumStr)||LENGTH((p_NumStr)<1
THENreturnFalse;ENDIF;SETv_Num=To_Number(p_NumStr);ReturnTrue;END;可讀性要求SELECT語句使用SELECT語句時,不允許使用SELECT*,要使用明確的列名。目的是防止數(shù)據(jù)字段增加后的影響。INSERT語句使用INSERT時,必須指定插入的字段名,主要是考慮以后表結(jié)構(gòu)的變動。表別名的使用多表關(guān)聯(lián)查詢,必須使用表的別名。函數(shù)及表達式應(yīng)將SQL語句中的數(shù)據(jù)庫函數(shù)、計算表達式等放置在等號右邊。不要在等號的左邊。比較符號的使用“!=”和“<>”是等價的,都代表不等于的意義。為了統(tǒng)一,不等于一律使用“<>”表示。編程語言中使用SQL在JAVA、C#等編程語言中,使用SQL語句應(yīng)遵循以下規(guī)則:連接語法在同一條語句中只選用一種連接語法,不能混合使用。字符串拼接對于可控的語法元素(一般為不來源于外部用戶輸入的元素),可以使用字符串拼接技術(shù)來構(gòu)造SQL語句。其中,短小的語句盡量使用連接符("+")進行拼接。長度較大的語句在JAVA中使用StringBuffer的append方法拼接,在C#中使用StringBuilder的Append方法拼接。對于不可控的語法元素,應(yīng)盡量避免使用SQL的動態(tài)拼接,否則,容易遭受SQL注入攻擊??稍诰幊陶Z言中使用參數(shù)化SQL語法或直接使用存儲過程進行數(shù)據(jù)的查詢和存取。選用ORM原則對于純粹的業(yè)務(wù)比較簡單的OLTP型,并且要求不是很高的應(yīng)用,建議使用ORM工具自動映射;對于擁有專門的數(shù)據(jù)庫開發(fā)人員,并且對數(shù)據(jù)密集型要求性較高的應(yīng)用,建議直接使用SQL語句或存儲過程;管理SQL代碼對于編程語言中出現(xiàn)的SQL操作語句,采用集中式統(tǒng)一管理,應(yīng)盡量避免出現(xiàn)SQL代碼分散在各處的情況出現(xiàn)。例如,可以將SQL代碼抽象到文本文件如XML中統(tǒng)一存儲。腳本規(guī)范注釋編寫每個數(shù)據(jù)庫程序?qū)ο螅ㄟ^程函數(shù)、觸發(fā)器等)、變量及常量必須使用注釋,數(shù)據(jù)庫程序中的說明性注釋必須與模板中的注釋格式一致。注釋形式一律使用:/**/。腳本管理由于項目設(shè)計資源眾多,必須要對其重要文檔、源代碼、發(fā)布程序包等統(tǒng)一管理,規(guī)范文件存放位置,定期對文件備份,保證項目開發(fā)的順利進行。統(tǒng)一創(chuàng)建目錄存放各開發(fā)人員所創(chuàng)建的對象包括函數(shù)、觸發(fā)器、存儲過程、數(shù)據(jù)包等,具體的存儲形式說明如下:函數(shù)腳本函數(shù)腳本擴展名為“fnc”,其命名遵循如下的格式:FUNC_SubSystemName_DetailName以上格式中:FUNC是必需的,表示該對象為函數(shù);SubSystemNameName是數(shù)據(jù)庫的功能模塊或其簡稱;DetailName與函數(shù)意義相關(guān)聯(lián)的英文單詞、詞組或其縮寫;總長度必需符合數(shù)據(jù)庫的規(guī)定。觸發(fā)器腳本觸發(fā)器腳本擴展名為“trg”,其命名遵循如下的格式:TRIG_TableName_DetailName以上格式中:TRIG是必需的,表示該對象為觸發(fā)器;TableName是數(shù)據(jù)庫中表的名稱或其簡稱;DetailName與觸發(fā)器意義相關(guān)聯(lián)的英文單詞、詞組或其縮寫;總長度必需符合數(shù)據(jù)庫的規(guī)定。存儲過程腳本存儲過程腳本擴展名為“prc”,其命名遵循如下的格式:PROG_SubSystemName_DetailName以上格式中:PROG是必需的,表示該對象為存儲過程;SubSystemName是數(shù)據(jù)庫中表的名稱或其簡稱;DetailName與觸發(fā)器意義相關(guān)聯(lián)的英文單詞、詞組或其縮寫;總長度必需符合數(shù)據(jù)庫的規(guī)定。增刪改腳本增刪改腳本擴展名為“sql”,其命名遵循如下的格式:業(yè)務(wù)子項_功能說明_年月日(yyyymmdd)_序號(兩位數(shù)字01、02等),如:AM_COLLPONIT_20090401_01.sql。性能優(yōu)化使用索引對大表的操作,業(yè)務(wù)規(guī)范后,必須建立相應(yīng)的有效索引,以提高查詢效率。此外,在WHERE子句中,不應(yīng)對索引列使用函數(shù)或進行運算,否則該索引將失效;如果非要使用,那么就需要建立相應(yīng)的函數(shù)索引。類型轉(zhuǎn)換不要使用數(shù)據(jù)庫的類型自動轉(zhuǎn)換功能(如數(shù)字自動轉(zhuǎn)換為字符串),應(yīng)使用顯式的類型轉(zhuǎn)換。自動轉(zhuǎn)換時往往導(dǎo)致該字段的索引無法使用。UNION替代OR(適用于索引列)通常情況下,用UNION替換WHERE子句中的OR將會起到較好的效果。對索引列使用OR將造成全表掃描。注意,以上規(guī)則只針對多個索引列有效。如果有column沒有被索引,查詢效率可能會因為你沒有選擇OR而降低。在下面的例子中,LOC_ID和REGION上都建有索引?!臼纠浚焊咝В篠ELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10UNIONSELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHEREREGION=’MELBOURNE’低效:SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10ORREGION=‘MELBOURNE’注意:WHEREKEY1=10(返回最少記錄)ORKEY2=20(返回最多記錄)內(nèi)部將以上轉(zhuǎn)換為WHEREKEY1=10AND((NOTKEY1=10)ANDKEY2=20)TRUNCATE替代DELETE當(dāng)刪除表中的所有記錄時,如果不需要恢復(fù),建議使用TRUNCATE而不是DELETEALL,既不占用回滾段,也能加快速度。WHERE替代HAVINGHAVING只會在檢索出所有記錄之后才對結(jié)果集進行過濾。這個處理需要排序、總計等操作。如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷。EXISTS替代IN在許多基于基礎(chǔ)表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯(lián)接。在這種情況下,使用EXISTS(或NOTEXISTS)通常將提高查詢的效率?!臼纠浚焊咝В篠ELECT*FROMEMP(基礎(chǔ)表)WHEREEMPNO>0ANDEXISTS(SELECT‘X’FROMDEPTWHEREDEPT.DEPTNO=EMP.DEPTNOANDLOC=‘MELB’)低效:SELECT*FROMEMP(基礎(chǔ)表)WHEREEMPNO>0ANDDEPTNOIN(SELECTDEPTNOFROMDEPTWHERELOC=‘MELB')NOTEXISTS替代NOTIN無論在哪種情況下,NOTIN都是最低效的(因為它對子查詢中的表執(zhí)行了一個全表遍歷)??梢园阉膶懗赏膺B接(OuterJoins)或NOTEXISTS.【示例】:SELECT…FROMEMPWHEREDEPT_NONOTIN(SELECTDEPT_NOFROMDEPTWHEREDEPT_CAT='A');高效SELECT….FROMEMPEWHERENOTEXISTS(SELECT‘X’FROMDEPTDWHERED.DEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A’);表連接替代EXISTS通常來說,采用表連接的方式比EXISTS更有效率?!臼纠浚篠ELECTENAMEFROMEMPEWHEREEXISTS(SELECT‘X’FROMDEPTWHEREDEPT_NO=E.DEPT_NOANDDEPT_CAT=‘A’);更高效:SELECTENAMEFROMDEPTD,EMPEWHEREE.DEPT_NO=D.DEPT_NOANDDEPT_CAT=‘A’;WHERE子句避免在索引列上使用計算WHERE子句中,如果索引列參與計算,優(yōu)化器將不使用索引而使用全表掃描?!臼纠浚旱托В篠ELECT…FROMDEPTWHERESAL*12>25000;高效:SELECT…FROMDEPTWHERESAL>25000/12;EXISTS連接替代DISTINCT當(dāng)提交一個包含一對多表信息(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT。一般可以考慮用EXIST替換?!臼纠浚旱托В篠ELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO;高效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT‘X’FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);避免在索引列上使用NOT避免在索引列上使用NOT,NOT會產(chǎn)生和在索引列上使用函數(shù)相同的影響。當(dāng)遇到NOT,會停止使用索引轉(zhuǎn)而執(zhí)行全表掃描。【示例】:低效(不使用索引):SELECT…FROMDEPTWHERENOTDEPT_CODE=0;高效(使用了索引):SELECT…FROMDEPTWHEREDEPT_CODE>0;需要注意的是,在某些時候,優(yōu)化器會自動將NOT轉(zhuǎn)化成相對應(yīng)的關(guān)系操作符。NOT>to<=NOT>=to<NOT<to>=NOT<=to>>=替代>如果DEPTNO上有一個索引。【示例】:低效:SELECT*FROMEMPWHEREDEPTNO>3;高效(使用了索引):SELECT*FROMEMPWHEREDEPTNO>=4;兩者的區(qū)別在于,前者DBMS將直接跳到第一個DEPT等于4的記錄而后者將首先定位到DEPTNO=3的記錄并且向前掃描到第一個DEPT大于3的記錄。事務(wù)提交COMMIT在程序中盡量避免特大事務(wù),多使用COMMIT,這樣程序的性能得到提高,也會因為COMMIT所釋放的資源而減少。當(dāng)然要注意,COMMIT次數(shù)也不能太頻繁,頻繁同樣會增加數(shù)據(jù)庫負(fù)擔(dān)。質(zhì)量保證運行日志是指SQL運行點的輸出日志。要求程序一定要使用日志語句,在運行過程輸出。日志的輸出,可以是數(shù)據(jù)表,或者通過Java函數(shù),或者UT_FILE包,書寫到操作系統(tǒng)文件。運行日志必須設(shè)置調(diào)試開關(guān),在生產(chǎn)環(huán)境有效屏蔽其在開發(fā)測試環(huán)境輸出的日志。錯誤日志系統(tǒng)容錯處理的日志,一定要與運行日志分開。使用數(shù)據(jù)表時,錯誤日志的數(shù)據(jù)表與運行日志表不同;使用操作系統(tǒng)文件時,錯誤日志文件名與運行日志文件名不同。工作日志系統(tǒng)關(guān)鍵性的SQL執(zhí)行情況,應(yīng)包括語句、記錄數(shù)等的日志,便于程序上線后維護。異常檢查SQL程序,一定使用BEGIN/EXCEPTION/END代碼塊,進行錯誤捕獲,并輸出錯誤日志。一致性約束一致性考查表規(guī)范點標(biāo)記規(guī)范點說明約束等級(強制:M,推薦:O)5排版規(guī)范M5.1縮進和對齊M5.2空格和換行M5.3空白的使用M5.4大小寫風(fēng)格M5.5語句排版M5.5.1IF語句M5.5.2編程語言中SQL語句M6注釋規(guī)范M6.1注釋量M6.2注釋位置M6.3對象注釋M6.4文件注釋M6.5過程和函數(shù)注釋M6.6變量及常量注釋M6.7參數(shù)注釋M6.8功能注釋M6.9語句注釋M7命名規(guī)范M7.1對象命名M7.2變量命名M7.3表屬性命名M7.3.1表名M7.3.2表分區(qū)名M7.3.3字段名M7.3.4主鍵名M7.3.5外鍵名M7.4用戶與角色M8語法規(guī)范M8.1簡單函數(shù)或過程M8.2可讀性要求M8.2.1SELECT語句M8.2.2INSERT語句M8.2.3表別名的使用M8.2.4函數(shù)及表達式M8.2.5比較符號的使用M8.3編程語言中使用SQLM8.3.1連接語法M8.3.2字符串拼接M8.3.3選用ORM原則O8.3.4管理SQL代碼M9腳本規(guī)范M9.1注釋編寫M9.2腳本管理M10性能優(yōu)化MO10.1使用索引M10.2類型轉(zhuǎn)換M10.3UNION替代OR(適用于索引列)O10.4TRUNCATE替代DELETEO10.5WHERE替代HAVINGO10.6EXISTS替代INO10.7NOTEXISTS替代NOTINO10.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 遺傳算法流程圖
- 教育部學(xué)科分類與代碼(全部)
- 2024購銷合同下載范文
- 2024臨時工解聘協(xié)議書臨時工聘用合同協(xié)議書
- 自然資源安全生產(chǎn)
- 規(guī)劃課題申報范例:“雙高?!笨冃гu價研究(附可修改技術(shù)路線圖)
- 深圳大學(xué)《知識產(chǎn)權(quán)法學(xué)》2021-2022學(xué)年期末試卷
- 副主任醫(yī)師定期考核述職報告范文(7篇)
- 關(guān)于班組長安全承諾書3篇
- 軍訓(xùn)決心書(集錦15篇)
- 東營港加油、LNG加氣站工程環(huán)評報告表
- 2024年日歷(打印版每月一張)
- 車用動力電池回收利用 管理規(guī)范 第2部分:回收服務(wù)網(wǎng)點征求意見稿編制說明
- 新劍橋少兒英語第六冊全冊配套文本
- 科學(xué)預(yù)測方案
- 職業(yè)生涯規(guī)劃網(wǎng)絡(luò)與新媒體專業(yè)
- T-WAPIA 052.2-2023 無線局域網(wǎng)設(shè)備技術(shù)規(guī)范 第2部分:終端
- 市政管道開槽施工-市政排水管道的施工
- 初中八年級英語課件Reading Giant pandas-“江南聯(lián)賽”一等獎2
- 人工智能在教育行業(yè)中的應(yīng)用與管理
- 心衰合并胸腔積液的護理Ppt
評論
0/150
提交評論