SlideShare a Scribd company logo
從Developer來看
效能調校
1
亂馬客
2015/05/26
Developer 只管寫 Code 2
當系統 …很慢…
3
其實不知
到底怎麼回事!!!
4
釐清
慢在那裡?
5
用工具
 客戶
 Fiddler
 Log Parser
 Monitoring Agent
 Dynatrace
6
客戶,哭給你看 7
客戶 8
Fiddler:把User的感受量化 9
Fiddler
Fiddler / Browser Tool F12 10
IIS Log 11
IIS Log:記錄每個Request的資訊 12
IIS Log
Fiddler
Log Parser 13
Log Parser Lizard 14
找出
慢的、資料大的
程式
15
MS Monitoring Agent: 監控 .NET 程式 16
IIS Log
Fiddler
Microsoft Monitoring Agent
Microsoft Monitoring Agent 17
利用 Microsoft Monitoring Agent 來找出系統效能及異常問題
Dynatrace: 監控程式 18
IIS Log
Fiddler
Microsoft Monitoring Agent
Dynatrace
Dynatrace
Dynatrace Dynatrace
Dynatrace 19
 完整的資訊
Monitoring Agent &
Dynatrace
可以找出更詳細的資訊
20
調校方式
 定目標
目前狀況 …
調整後 …
 改善項目
程式Logic
網頁
DB
21
調校目標
8秒 -> 3秒
22
程式Logic
 某個Method重覆呼叫了 N 次!
 交易過長
 取得過多的資料
 CRM 新光人壽 透過 WebService 取得個人的 Todo
 取得所有的 Todo 回到 AP 再 Filter 出目前這個 User 的 Todo
 …
23
200 /304
GET / Cache
24
設定賞味期 25
IIS 動態/靜態 壓縮 26
MS SQL
用 Profiler
 使用 範本
 勾選要看資訊
 設定篩選條件
27
Profiler
使用範本
 選擇要看的 Events
28
Profiler
勾選要看資訊
 Duration
 CPU/Reads/Writes
 RowCounts
 TransactionId
 …
29
Profiler
設定篩選條件
 Duration >= 1
 過濾一些很快的SQL
 ApplicationName
 Focus 在 有問題的 AP 上面
 Reads/Writes > …
30
SQL Profiler 31
SQL Trace 32
Execution plan 33
Execution plan
1. 預估 VS 實際
2. 成本 & Scan
34
預估執行計畫 35
實際執行計畫 36
預估筆數 VS 實際筆數 37
更新統計資訊
UPDATE STATISTICS [tablename];
38
統計資訊 39
Missing index warnings 40
高成本 & Scan
SELECT ....
FROM LOL_LEV --約18萬筆
WHERE
LEFT(BAR_CODE,7)=dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDA
TE(),112),2)
-- BAR_CODE欄位中,NULL的資料,有 163,709 筆
41
解法-1
 使用計算欄位 並增加Index
ALTER TABLE LOL_LEV
ADD BAR_CODE_DATE AS LEFT(BAR_CODE,7) PERSISTED;
42
解法-2
 用Filtered Indexes
CREATE NONCLUSTERED INDEX
NCIDX_BAR_CODE_FILTER
ON [dbo].[LOL_LEV] (BAR_CODE)
WHERE BAR_CODE IS NOT NULL ;
GO
使用Filtered Index要注意的地方
43
解法-3
 Index + 改Query
CREATE NONCLUSTERED INDEX NCIDX_BAR_CODE
ON [dbo].[LOL_LEV] (BAR_CODE)
GO
WHERE
LEFT(BAR_CODE,7)=dbo.fnDATE_CHANGE(CONVERT(VARCHAR,GETDATE(),1
12),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'
44
避免在 Where
的欄位中使用
Function
如:IsNull, Left …
45
Nested Lookup 46
解法
加入原有 Index 的 Include
CREATE INDEX AK_Employee_NationalIDN ON
dbo.EMP_EMPLOYEE
(PER_SERIL_NO, CNAME)
INCLUDE (ID_NO, ENAME);
47
48
Deadlock
 通常是 交易 + 某個SQL沒有用到 Seek
49
Update with SCAN 50
Update with SCAN
Detail
 先取 Update Lock
 符合就取 Exclusive Lock
 然後更新它
51
Summary
 Web AP
 Cache
 Compress
 DB
 更新統計資訊
 調整 Index
 用 Seek 取代 Scan
 用 Include 取代 Lookup
52
Thanks
54

More Related Content

PPTX
SQL Count(*) VS Count(1)
PPTX
Sql效能調校分享-資料瘦身
PPTX
Angular2 Form
PPTX
Internet of Things
PPTX
軟體弱點掃描
PPTX
Angular2 DI
PPTX
Asp.net開發要注意的是?
PDF
Fiddler使用技巧
SQL Count(*) VS Count(1)
Sql效能調校分享-資料瘦身
Angular2 Form
Internet of Things
軟體弱點掃描
Angular2 DI
Asp.net開發要注意的是?
Fiddler使用技巧

Similar to 從Developer來看 效能調校 (6)

PPT
Mobile app security
PDF
Lenovo SAP Customer Success Story
PPTX
查小三 + 新智慧營運 Splunk4.2大顯身手
PDF
CYBERSEC 2020 臺灣資安大會 windows malware hot 5 - 短短
PPTX
Forensics 101
PPTX
Forensics 101 的副本
Mobile app security
Lenovo SAP Customer Success Story
查小三 + 新智慧營運 Splunk4.2大顯身手
CYBERSEC 2020 臺灣資安大會 windows malware hot 5 - 短短
Forensics 101
Forensics 101 的副本
Ad

從Developer來看 效能調校

Editor's Notes

  • #18: http://www.dotblogs.com.tw/rainmaker/archive/2014/05/01/144927.aspx 找出錯誤及超過5秒的資訊
  • #27: http://www.codeproject.com/Articles/242133/Making-the-most-out-of-IIS-compression-Part-conf http://weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much
  • #32: 可以用 Trace
  • #34: http://www.sqlsentry.net/plan-explorer/sql-server-query-view.asp
  • #38: ALTER INDEX ALL ON tablename REBUILD;
  • #49: USE ARTC_SOD20_M GO SELECT SRNO_CODE, SRNO_CODE_DESC, GIST_DESC FROM dbo.FMMITEM WITH (INDEX(IX_FMMITEM_2)) WHERE SRNO_CODE = '1030001516' --CREATE INDEX IX_FMITEM_2_1 ON dbo.FMMITEM --(SRNO_CODE) --INCLUDE(SRNO_CODE_DESC, GIST_DESC); SELECT SRNO_CODE, SRNO_CODE_DESC, GIST_DESC FROM dbo.FMMITEM WITH (INDEX(IX_FMITEM_2_1)) WHERE SRNO_CODE = '1030001516'
  • #51: 它會一筆筆地找,先取得Update Lock,不符合就Rease Update Lock,然後再取下一筆,有符合的,就取得  Exclusive Lock 。 而第2個查詢,會等待是因為要取得 Update Lock ,而該筆資料被查詢1取得了Exclusive Lock了!
  • #52: Used to establish a lock hierarchy. The types of intent locks are: intent shared (IS), intent exclusive (IX), and shared with intent exclusive (SIX).