數據庫相關的開發&優化原則
- 為每個數據表創建聚集索引,以及其它必要的索引(根據業務需求識別經常要查詢的字段)
- 數據表結構的定義應該優先考慮降低SQL查詢的復雜性
- 優先使用唯一索引來保證字段值的不重復性(用異常來識別重復插入)
- 可適當增加冗余字段降低查詢的復雜度
- WHERE過濾條件要符合SARG原則
- 使用參數化查詢,重用執行計划
- 共用數據庫連接,避免反復打開。
- 盡量使用有序GUID,避免直接使用 newid()
- 禁止使用觸發器,禁止使用存儲過程,禁止使用CLR SP
- 避免在數據庫中執行較復雜的業務邏輯(SP),或者復雜的數據轉換、計算
- 盡量降低SQL語句的復雜性,可適當返回 粗粒度結果讓 應用程序代碼來處理
缺少索引的危害
- I/O -> 內存 -> CPU , 壓力全部變大。
- 由於需要掃描大量記錄,導致語句運行很慢。
- 容易產生大量的鎖,阻塞其它進程,以及被阻塞。
- 由於持有過多的鎖,出現死鎖的機率也會變大。
缺少索引的改進建議
- 為表指定主鍵
- 為外鍵字段創建索引
- 為一些重要的查詢條件創建索引
- 關注執行計划中高成本的:掃描,聯接,分組,排序。
創建索引的注意事項
- 索引不是越多越好,尤其要避免產生冗余索引。
- 只為頻繁查詢的參考字段創建索引。
- 創建高選擇性的索引(符合條件的行數與總行數之比)。
- 索引值不得超過900字節
- 不建議創建包含索引(除非那個查詢非常穩定非常重要)
冗余索引的危害
- 更新數據的SQL運行更慢,因為要維護索引。
- 浪費更多的磁盤資源。
- 耗費更多的維護成本。
SARG是什么?
SARG: Searchable Arguments
搜索參數 (SARG) 可指定精確匹配、
值的范圍或由 AND 聯接的兩項或多項的連接,因此能夠限制搜索范圍。
SARG格式:
- 列 運算符 <常量或變量>
- <常量或變量> 運算符 列
SARG 運算符包括 =、>、<、>=、<=、IN、BETWEEN,
有時還包括 LIKE(在進行前綴匹配時,如 LIKE ‘Fish%')。
SARG 可以包括由 AND 聯接的多個條件。
非 SARG 運算符包括: NOT運算符 、函數調用 和 字段計算表達式。
不符合SARG的改進建議
- 有函數調用的:去掉函數掉用,調整語句。
- 字段計算表達式:將字段與常量分離。
- 使用 NOT:調整業務需求,使用一個較小的范圍。
- 使用 NOT:根據業務需求,拆分表。
- LIKE‘%XXX%’ :調整業務需求,改寫為 LIKE ‘XXX%’