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