從Developer來看效能調校

53
從 Developer 從從 從從從從 1 從從從 2015/05/26

Transcript of 從Developer來看效能調校

Page 1: 從Developer來看效能調校

1

從 Developer 來看效能調校亂馬客

2015/05/26

Page 2: 從Developer來看效能調校

2Developer 只管寫 Code

Page 3: 從Developer來看效能調校

3

當系統 …很慢…

Page 4: 從Developer來看效能調校

4其實不知到底怎麼回事 !!!

Page 5: 從Developer來看效能調校

5釐清

慢在那裡 ?

Page 6: 從Developer來看效能調校

6用工具客戶FiddlerLog ParserMonitoring AgentDynatrace

Page 7: 從Developer來看效能調校

7客戶,哭給你看

Page 8: 從Developer來看效能調校

8客戶

Page 9: 從Developer來看效能調校

9Fiddler: 把 User 的感受量化

Fiddler

Page 10: 從Developer來看效能調校

10Fiddler / Browser Tool F12

Page 11: 從Developer來看效能調校

11IIS Log

Page 12: 從Developer來看效能調校

12IIS Log: 記錄每個 Request 的資訊

IIS LogFiddler

Page 15: 從Developer來看效能調校

15

找出慢的、資料大的程式

Page 16: 從Developer來看效能調校

16MS Monitoring Agent: 監控 .NET 程式

IIS LogFiddler

Microsoft Monitoring Agent

Page 18: 從Developer來看效能調校

18Dynatrace: 監控程式

IIS LogFiddler

Microsoft Monitoring AgentDynatrac

e

Dynatrace

Dynatrace

Dynatrace

Page 19: 從Developer來看效能調校

19Dynatrace

完整的資訊

Page 20: 從Developer來看效能調校

20

Monitoring Agent & Dynatrace 可以找出更詳細的資訊

Page 21: 從Developer來看效能調校

21調校方式定目標

目前狀況 …調整後 …

改善項目程式 Logic網頁DB

Page 22: 從Developer來看效能調校

22

調校目標8 秒 -> 3 秒

Page 23: 從Developer來看效能調校

23程式 Logic

某個 Method 重覆呼叫了 N 次 ! 交易過長 取得過多的資料

CRM 新光人壽 透過 WebService 取得個人的 Todo 取得所有的 Todo 回到 AP 再 Filter 出目前這個 User 的 Todo

Page 24: 從Developer來看效能調校

24200 / 3 04GET / Cache

Page 25: 從Developer來看效能調校

25設定賞味期

Page 26: 從Developer來看效能調校

26IIS 動態 / 靜態 壓縮

Page 27: 從Developer來看效能調校

27MS SQL用 Profiler 使用 範本 勾選要看資訊 設定篩選條件

Page 28: 從Developer來看效能調校

28Profiler使用範本 選擇要看的 Events

Page 29: 從Developer來看效能調校

29Profiler勾選要看資訊 Duration

CPU/Reads/Writes

RowCounts

TransactionId

Page 30: 從Developer來看效能調校

30Profiler設定篩選條件 Duration >= 1

過濾一些很快的 SQL

ApplicationName Focus 在 有問題的 AP 上面

Reads/Writes > …

Page 31: 從Developer來看效能調校

31SQL Profiler

Page 32: 從Developer來看效能調校

32SQL Trace

Page 33: 從Developer來看效能調校

33Execution plan

Page 34: 從Developer來看效能調校

34Execution plan

1. 預估 VS 實際2. 成本 & Scan

Page 35: 從Developer來看效能調校

35預估執行計畫

Page 36: 從Developer來看效能調校

36實際執行計畫

Page 37: 從Developer來看效能調校

37預估筆數 VS 實際筆數

Page 39: 從Developer來看效能調校

39統計資訊

Page 40: 從Developer來看效能調校

40Missing index warnings

Page 41: 從Developer來看效能調校

41高成本 & Scan

SELECT ....FROM LOL_LEV -- 約 18 萬筆WHERE LEFT(BAR_CODE,7)=dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDATE(),112),2)-- BAR_CODE 欄位中, NULL 的資料,有 163,709 筆

Page 42: 從Developer來看效能調校

42解法 -1

使用計算欄位 並增加 IndexALTER TABLE LOL_LEV

ADD BAR_CODE_DATE AS LEFT(BAR_CODE,7) PERSISTED;

Page 43: 從Developer來看效能調校

43解法 -2

用 Filtered IndexesCREATE NONCLUSTERED INDEX NCIDX_BAR_CODE_FILTER ON [dbo].[LOL_LEV] (BAR_CODE) WHERE BAR_CODE IS NOT NULL ;GO

使用Filtered Index要注意的地方

Page 44: 從Developer來看效能調校

44解法 -3

Index + 改 QueryCREATE NONCLUSTERED INDEX NCIDX_BAR_CODE ON [dbo].[LOL_LEV] (BAR_CODE) GO

WHERE LEFT(BAR_CODE,7)=dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDATE(),112),2)改成WHERE BAR_CODE > dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDATE(),112),2) + '000' and BAR_CODE < dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDATE(),112),2) + '999'

Page 45: 從Developer來看效能調校

45避免在 Where 的欄位中使用Function如 :IsNull, Left …

Page 46: 從Developer來看效能調校

46Nested Lookup

Page 47: 從Developer來看效能調校

47解法加入原有 Index 的 IncludeCREATE INDEX AK_Employee_NationalIDN ON dbo.EMP_EMPLOYEE(PER_SERIL_NO, CNAME)INCLUDE (ID_NO, ENAME);

Page 48: 從Developer來看效能調校

48

Page 49: 從Developer來看效能調校

49Deadlock

通常是 交易 + 某個 SQL 沒有用到 Seek

Page 50: 從Developer來看效能調校

50Update with SCAN

Page 51: 從Developer來看效能調校

51Update with SCANDetail

先取 Update Lock 符合就取 Exclusive Lock

然後更新它

Page 52: 從Developer來看效能調校

52Summary

Web AP Cache Compress

DB 更新統計資訊 調整 Index

用 Seek 取代 Scan 用 Include 取代 Lookup

Page 53: 從Developer來看效能調校

54

Thanks