閱讀677 返回首頁    go 技術社區[雲棲]


正確統計SQLServer的慢日誌

作者:方波

RDS的一個富有吸引力的服務是為用戶提供慢日誌的運行狀況報告。報告從不同的維度(總執行時間,總執行次數,總邏輯讀,總物理讀)為用戶提供TOP20的SQL。RDS希望在為用戶提供穩定,快速服務的同時,用戶可以從RDS得到更有個性化的優化建議。

 

這些信息很重要,用戶可以有針對性地采取一些措施提高係統的性能。比如:對於那些總執行次數很多的SQL,用戶可以在涉及到這些SQL的業務中加入緩存;如果某個SQL的總邏輯讀很多,那麼,用戶極有必要為這些SQL涉及的字段添加緩存(從RDS缺失索引推薦服務的結果看,這類總邏輯讀很多的SQL得到索引推薦的可能性很大)。

 

下麵是一個報表的例子:

 

t_1352046453

 

 

t_1353311742

 

t_1355029806

 

t_1356408529

 

 

我們需要得到某一個時間段的SQL統計信息,比如某一天的運行狀況。為了得到SQLServer的SQL統計信息,我們做了一些非常有意思的工作,原因在於SQLServer沒有直接提供“某個時間段”的SQL運行信息。但是,SQLServer的sys.dm_exec_query_stats視圖提供了SQL即時的運行統計信息(我們主要關注execution_count,total_elapsed_time,total_logical_reads,total_physical_reads這四個指標),這些統計信息是不斷增長的,並且這些統計信息極有可能從緩存中換出。也就是說,如果某個SQL的統計信息不從緩存中換出,那麼這些統計項的值是不斷累加的,比如,昨天你看到execution_count是120,今天你會看到execution_count是230,到了明天,execution_count的值可能就是512。

 

為了得到“某個時間段的統計信息”,我們需要采取一些措施才行。核心的算法由@鹿久同學提供,其思想就是定期為sys.dm_exec_query_stats打快照(snapshot),然後根據快照計算快照的差值,從而得到某個時間段的運行狀況統計信息。

 

例如,在1:00時,我們打了一次快照,此時某個SQL的execution_count的值是100, 在6:00時,我們再次打了一次快照,此時execution_count的值是120,在23:00時,我們又打了一次快照,此時execution_count的值是900。通過快照的信息,我們可以得知a) 1:00到6:00之間,該SQL執行了20次,b) 在1:00到23:00之間,該SQL執行了800次。我們可以大約得知,該SQL當天執行了800次。

 

RDS目前每一小時打一次快照,每8小時對當前的快照進行匯總,生成報表。下麵是RDS大快照的一段記錄:

 

t_1409019548

 

此外,RDS重點對這些慢日誌進行分析,提供了缺失索引推薦服務。

 

目前,眾多的中小網站越來越認可RDS的服務,越來越多在阿裏雲平台上跑的應用選擇將數據庫布署在RDS。RDS正在追求更多的個性化服務,為中小網站的開發者提供更多的幫助。

最後更新:2017-04-03 08:26:25

  上一篇:go android個推平台
  下一篇:go Lua數據結構 — lua_State(六)