從Developer來看效能調校

Preview:

Citation preview

1

從 Developer 來看效能調校亂馬客

2015/05/26

2Developer 只管寫 Code

3

當系統 …很慢…

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

5釐清

慢在那裡 ?

6用工具客戶FiddlerLog ParserMonitoring AgentDynatrace

7客戶,哭給你看

8客戶

9Fiddler: 把 User 的感受量化

Fiddler

10Fiddler / Browser Tool F12

11IIS Log

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

IIS LogFiddler

15

找出慢的、資料大的程式

16MS Monitoring Agent: 監控 .NET 程式

IIS LogFiddler

Microsoft Monitoring Agent

18Dynatrace: 監控程式

IIS LogFiddler

Microsoft Monitoring AgentDynatrac

e

Dynatrace

Dynatrace

Dynatrace

19Dynatrace

完整的資訊

20

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

21調校方式定目標

目前狀況 …調整後 …

改善項目程式 Logic網頁DB

22

調校目標8 秒 -> 3 秒

23程式 Logic

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

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

24200 / 3 04GET / Cache

25設定賞味期

26IIS 動態 / 靜態 壓縮

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

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

29Profiler勾選要看資訊 Duration

CPU/Reads/Writes

RowCounts

TransactionId

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

過濾一些很快的 SQL

ApplicationName Focus 在 有問題的 AP 上面

Reads/Writes > …

31SQL Profiler

32SQL Trace

33Execution plan

34Execution plan

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

35預估執行計畫

36實際執行計畫

37預估筆數 VS 實際筆數

39統計資訊

40Missing index warnings

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 筆

42解法 -1

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

ADD BAR_CODE_DATE AS LEFT(BAR_CODE,7) PERSISTED;

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要注意的地方

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'

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

46Nested Lookup

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

48

49Deadlock

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

50Update with SCAN

51Update with SCANDetail

先取 Update Lock 符合就取 Exclusive Lock

然後更新它

52Summary

Web AP Cache Compress

DB 更新統計資訊 調整 Index

用 Seek 取代 Scan 用 Include 取代 Lookup

54

Thanks

Recommended