View
38
Download
1
Category
Preview:
Citation preview
2Developer 只管寫 Code
3
當系統 …很慢…
4其實不知到底怎麼回事 !!!
5釐清
慢在那裡 ?
6用工具客戶FiddlerLog ParserMonitoring AgentDynatrace
7客戶,哭給你看
8客戶
9Fiddler: 把 User 的感受量化
Fiddler
11IIS Log
12IIS Log: 記錄每個 Request 的資訊
IIS LogFiddler
15
找出慢的、資料大的程式
16MS Monitoring Agent: 監控 .NET 程式
IIS LogFiddler
Microsoft Monitoring Agent
17Microsoft Monitoring Agent
利用 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 實際筆數
38更新統計資訊UPDATE STATISTICS [tablename];
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