--========================================================
以下是一些開發(fā)實(shí)際相關(guān)的建議,敬請拍磚
--========================================================
1. 使用統(tǒng)一的命名規(guī)范
命名規(guī)范是保證代碼風(fēng)格一致,提高代碼可讀性。
2. 避免使用SQL SERVER關(guān)鍵詞
使用關(guān)鍵詞作為表名/列名/別名降低代碼可讀性,并導(dǎo)致在將來的版本升級(jí)中可能出現(xiàn)風(fēng)險(xiǎn)。
3. 在查詢時(shí),使用[架構(gòu)].[對(duì)象名]來訪問對(duì)象,對(duì)表和視圖以及表值函數(shù)指定別名,使用[別名].[列名]來訪問數(shù)據(jù)列
在對(duì)象沒有指定架構(gòu)情況下,SQL SERVER 需要依據(jù)當(dāng)前用戶默認(rèn)架構(gòu)及相關(guān)權(quán)限來查找對(duì)象所屬架構(gòu),當(dāng)多個(gè)架構(gòu)下存在同名對(duì)象時(shí),未指名架構(gòu)可能會(huì)引發(fā)邏輯錯(cuò)誤。而對(duì)于未標(biāo)明所屬對(duì)象的列名,SQL SERVER遍歷所有查詢中使用到的對(duì)象來查找匹配的對(duì)象。使用[架構(gòu)].[對(duì)象名]和[別名].[列名]不僅提高了代碼可讀性,還有效減少查詢的編譯時(shí)間。
4. 避免使用sp_作為存儲(chǔ)過程前綴,以避免查找系統(tǒng)對(duì)象和潛在問題
對(duì)于使用sp_作為前綴存儲(chǔ)過程,查詢優(yōu)化器會(huì)優(yōu)先在系統(tǒng)存儲(chǔ)過程中查找,因此不建議使用sp_作為前綴
5. 避免返回?zé)o用數(shù)據(jù)列和無用的數(shù)據(jù)行。
無用的數(shù)據(jù)列和數(shù)據(jù)行會(huì)照成不必須要的查詢消耗和網(wǎng)絡(luò)消耗。
6. 使用自定義函數(shù)或子查詢時(shí),考慮執(zhí)行次數(shù)和性能消耗。
錯(cuò)誤使用自定義函數(shù)或子查詢會(huì)導(dǎo)致極差的性能,因此需要考慮自定義函數(shù)或子查詢執(zhí)行次數(shù)以及每次調(diào)用的消耗。
7. 對(duì)于復(fù)雜查詢,使用臨時(shí)表或表變量來緩存結(jié)果集
在生成執(zhí)行計(jì)劃過程中,執(zhí)行優(yōu)化器需要分析各種可能的執(zhí)行方案,隨著查詢復(fù)雜程度的增大,執(zhí)行方案的數(shù)量將會(huì)幾何級(jí)增長,并且很難準(zhǔn)確預(yù)估每個(gè)步驟的影響行數(shù)并生成高質(zhì)量的查詢(尤其對(duì)于聚合操作生成的中間結(jié)果集),將復(fù)雜查詢拆分成多條語句,并使用臨時(shí)表或表變量來緩存中間結(jié)果集,可能會(huì)對(duì)性能有顯著提升。
8. 使用查詢參數(shù)化
查詢參數(shù)化有利于執(zhí)行計(jì)劃重用,減少編譯,從而降低CPU消耗。
9. 對(duì)分布不均勻數(shù)據(jù)查詢特殊處理
在數(shù)據(jù)分布不均勻情況下,應(yīng)該數(shù)據(jù)分布的具體情況使用不同的查詢語句,或不使用查詢參數(shù)化,以避免使用相同執(zhí)行計(jì)劃導(dǎo)致的性能問題。
10. 考慮查詢是否需要DISTINCT和ORDER BY等操作符
部分開發(fā)人員由于對(duì)業(yè)務(wù)或數(shù)據(jù)不了解,濫用DISTINCT和ORDER BY等操作符,造成CPU資源浪費(fèi)和性能問題
11. 使用合適的數(shù)據(jù)類型來定義表,使用合適的數(shù)據(jù)類型來避免查詢中發(fā)生隱式轉(zhuǎn)換
表定義時(shí)使用不合適的數(shù)據(jù)類型(如時(shí)間存放成字符串),會(huì)導(dǎo)致如磁盤空間浪費(fèi)/數(shù)據(jù)被截?cái)?數(shù)據(jù)處理復(fù)雜等各種問題;而在查詢時(shí)使用不合適的數(shù)據(jù)類型,可能導(dǎo)致查詢中發(fā)生隱式轉(zhuǎn)換,當(dāng)隱式轉(zhuǎn)換發(fā)生在數(shù)據(jù)列上時(shí),會(huì)導(dǎo)致無法使用索引(或無法正確使用索引)。
12. 合理使用范式化和反范式化
在系統(tǒng)開發(fā)階段使用范式化來防止數(shù)據(jù)操作異常(更新異常/插入異常/刪除異常),在系統(tǒng)優(yōu)化階段使用反范式化來提升性能。
13. 分析數(shù)據(jù)訪問頻率
當(dāng)表中不同列的訪問頻率不同時(shí),考慮將更新頻率的數(shù)據(jù)列拆分到其他表中,考慮將更新頻率較低且占用空間較大的數(shù)據(jù)列拆分到其他表中。
--===================================================
相關(guān)參考
關(guān)鍵詞列表
http://msdn.microsoft.com/zh-cn/library/ms189822(v=sql.120).aspx
T-SQL編寫建議
http://www.cnblogs.com/CareySon/archive/2012/10/11/2719598.html
拆分復(fù)雜查詢
http://blogs.msdn.com/b/sqlcat/archive/2013/09/09/when-to-break-down-complex-queries.aspx
隱式轉(zhuǎn)換
http://www.cnblogs.com/TeyGao/p/3620846.html
--======================================================
新聞熱點(diǎn)
疑難解答
圖片精選