SQLServer效能優化一則小例項(2010-07-21)
首先找到 最耗CPU的top50 SQL
SELECT
total_cpu_time,
total_execution_count,
number_of_statements,
s2.text
--(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
FROM
(SELECT TOP 50
SUM(qs.total_worker_time) AS total_cpu_time,
SUM(qs.execution_count) AS total_execution_count,
COUNT(*) AS number_of_statements,
qs.sql_handle --,
--MIN(statement_start_offset) AS statement_start_offset,
--MAX(statement_end_offset) AS statement_end_offset
FROM
sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC) AS stats
CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2
有一條SQL執行效率非常差,大概30秒~80秒不等,而且佔據了所有CPU消耗時間的20%,並且執行次數也很多
select f_getconcatname(id) from table where id>1 and id<100
如果單個ID,速度還是很快的,初步判斷是ID未作索引的問題
後來檢視了一下該表的定義,已經做了索引,索引可以排除掉
在接著判斷是函式的問題
檢視了一下函式的定義,這個只是大概的函式
create function f_getconcatname(@id)
as
DECLARE cur_concat CURSOR FOR SELECT Name FROM tableB where id=@id
declare @ret varchar(200),@tmp varchar(20)
set @ret='';
set @tmp=''
OPEN cur_concat
FETCH NEXT FROM cur_concat into @tmp
WHILE @@FETCH_STATUS = 0
BEGIN
set ret=@ret+@tmp+','
FETCH NEXT FROM cur_concat into @tmp
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
end
原以為是函式內遊標迴圈太慢就修改了一下該函式
create function f_getconcatname(@id)
as
declare @ret varchar(200)
set @ret='';
SELECT @ret=@ret+Name+',' FROM tableB where id=@id
return @ret
end
沒想到竟然比遊標還慢
後來檢查了一下tableB關於ID的定義,發現ID沒有定義為索引
新增索引後再次嘗試,發現速度提高到0~1秒
OK,解決該問題
同時在CPU 消耗總量的TOP 50中居然有25問題與之有關,一連串順帶解決了25個問題,意外之喜
SELECT
total_cpu_time,
total_execution_count,
number_of_statements,
s2.text
--(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
FROM
(SELECT TOP 50
SUM(qs.total_worker_time) AS total_cpu_time,
SUM(qs.execution_count) AS total_execution_count,
COUNT(*) AS number_of_statements,
qs.sql_handle --,
--MIN(statement_start_offset) AS statement_start_offset,
--MAX(statement_end_offset) AS statement_end_offset
FROM
sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC) AS stats
CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2
有一條SQL執行效率非常差,大概30秒~80秒不等,而且佔據了所有CPU消耗時間的20%,並且執行次數也很多
select f_getconcatname(id) from table where id>1 and id<100
如果單個ID,速度還是很快的,初步判斷是ID未作索引的問題
後來檢視了一下該表的定義,已經做了索引,索引可以排除掉
在接著判斷是函式的問題
檢視了一下函式的定義,這個只是大概的函式
create function f_getconcatname(@id)
as
DECLARE cur_concat CURSOR FOR SELECT Name FROM tableB where id=@id
declare @ret varchar(200),@tmp varchar(20)
set @ret='';
set @tmp=''
OPEN cur_concat
FETCH NEXT FROM cur_concat into @tmp
WHILE @@FETCH_STATUS = 0
BEGIN
set ret=@ret+@tmp+','
FETCH NEXT FROM cur_concat into @tmp
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
end
原以為是函式內遊標迴圈太慢就修改了一下該函式
create function f_getconcatname(@id)
as
declare @ret varchar(200)
set @ret='';
SELECT @ret=@ret+Name+',' FROM tableB where id=@id
return @ret
end
沒想到竟然比遊標還慢
後來檢查了一下tableB關於ID的定義,發現ID沒有定義為索引
新增索引後再次嘗試,發現速度提高到0~1秒
OK,解決該問題
同時在CPU 消耗總量的TOP 50中居然有25問題與之有關,一連串順帶解決了25個問題,意外之喜
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-668659/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分享一個SQLite 效能優化例項SQLite優化
- JavaScript 前端效能優化小竅門例項彙總JavaScript前端優化
- 效能優化指南:效能優化的一般性原則與方法優化
- 淺談網頁基本效能優化規則小結網頁優化
- 如何讀懂火焰圖?+ 例項講解程式效能優化優化
- Spark效能調優——9項基本原則Spark
- sqlserver修改例項名稱SQLServer
- vue效能優化小結Vue優化
- 前端效能優化小結前端優化
- iOS效能優化系列篇之“優化總體原則”iOS優化
- 資料庫例項效能調優利器:Performance Insights資料庫ORM
- React效能優化:PureComponent的使用原則React優化
- 微信小程式效能優化微信小程式優化
- 小程式效能優化總結優化
- 【微信小程式】效能優化微信小程式優化
- 淺談小程式效能優化優化
- 優化 WebView 的載入速度例項優化WebView
- C# Winform程式介面優化例項C#ORM優化
- Web 頁面優化專項 > Lighthouse > 效能分數優化Web優化
- C# 程式碼效能優化舉例C#優化
- 正則式 REGEX - 例項
- spark效能優化(一)Spark優化
- Mysql效能優化一MySql優化
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- 幾個 JavaScript 效能優化小 TipJavaScript優化
- 微信小程式效能優化方案微信小程式優化
- outline優化一例優化
- 效能優化小冊 - 提高網頁響應速度:優化你的 CDN 效能優化網頁
- iptables 常用規則使用例項
- 讀小程式效能優優化實踐-筆記優化筆記
- 如何使用 MySQL 慢查詢日誌進行效能優化 - Profiling、mysqldumpslow 例項詳解MySql優化
- Kafka效能測試例項Kafka
- php例項化物件的例項方法PHP物件
- 【前端效能優化】vue效能優化前端優化Vue
- 實戰 PerfDog 優化小遊戲效能優化遊戲
- (iOS) UICollectionViewLayoutInvalidationContext效能優化 詳細流程圖 + 範例iOSUIViewContext優化流程圖
- 例項化list
- Android效能優化筆記(一)——啟動優化Android優化筆記
- 【譯】21 項優化 React App 效能的技術優化ReactAPP