SQL Server Tuning 技巧
- 開啟 set statistics io,time,profile on;
- 使用兩截式命名(Ex: dbo.Employee)
SARG格式
- seek:=、>、<、between、部分like(ex:'allen%')、in
- Not Seek: Like '%A%'、Like '%A' year(c1)=2016、c1+15=115
- 索引欄位依照選擇性高低擺放(密度*資料比例=>越小越好)
- 善用索引壓縮(SQL Server 2016)
- 使用涵蓋索引(避免bookmark lookup發生) =>bookmark lookup 會讓執行計畫不穩定
- 善用索引合併
原始
改寫:select c1 from indexdemo where c2 = 1 or c3 < 3
select c1 from indexdemo where c2 = 1 union select c1 from indexdemo with(index(idxc3)) where c3 < 3
- 避免多餘索引
索引設計技巧
- WPOC守則Where: 高選擇性
- Partition: Partition 高於 Order by
- Order by: 索引鍵順序要和排序依據欄位相同
- Cover:涵蓋欄位
- Null 會產生較差的執行計畫(欄位盡量指定Not Null,及Default Value)
- 判斷資料不存在使用not exist,少用 not in
- sp_executesql 取代 execute(提高執行計畫重用)
- 善用暫存資料表及衍生資料表(CTE)
- 執行計畫分析與優化(http://caryhsu.blogspot.tw/2011/06/sql-server.html)
a.開啟其他資訊:set statistics io,time,profile on;
b.CBO 為基礎
c.較低的邏輯讀取
d.較低整體執行計畫成本
e.較低CPU時間
f.評估table或index scan
g.評估bookmarks lookup、RID lookup多數情況可以使用seek取代
i.評估join類型(Nested Loop join、Merge join、Hash join)建立涵蓋索引移除lookup
j.評估order by
k.移除篩選(filter)確認索引鍵順序是否與排序欄位順序相同
通常是索引錯誤不正確