SQLServer效能資料解析
磁碟相關
ins_dir = MSSQL_DIR + "/ms" + str(port)
data_dir = ins_dir + `/data`
log_dir = ins_dir + `/log`
backup_dir = ins_dir + `/backup`
ins_size = func_os.get_dir_size(ins_dir)
data_size = func_os.get_dir_size(data_dir)
log_size = func_os.get_dir_size(log_dir)
backup_size = func_os.get_dir_size(backup_dir)
real_ins_size = ins_size - backup_size
other_size = real_ins_size - data_size - log_size
總空間:real_ins_size = 例項目錄空間 – 備份空間(落地備)
資料空間:data_size
其他檔案空間:other_size = 總空間 – 資料空間 – 日誌空間 = tepmdb空間大小(日誌+資料)+ 其它(errorlog+agentlog+fulltextlog+系統庫+JOBS)
BinLog空間:log_size
SQL Server效能相關
動態管理檢視和函式
與session執行有關
sys.dm_exec_connections
sys.dm_exec_sessions
與系統有關
sys.dm_os_performance_counters
與IO相關
sys.dm_io_virtual_file_stats
目錄檢視
資料庫和檔案目錄檢視
sys.master_files
sys.databases
sessions
命令
select count(*) from sys.dm_exec_sessions
where login_name not in (`root`,`aurora`,`sa`, `eagleye`)
and login_name not like `s\_%` escape `` and login_name not like %mssqld`
and login_name not like `%Administrator`
and status not in (`Preconnect`, `Dormant‘)
解釋
sys.dm_exec_sessions:是伺服器範圍的檢視,顯示了有關所有活動使用者連線和內部任務的資訊。
login_name 當前執行的會話所使用的 SQL Server 登入名。
status 會話的狀態。 可能的值:
Running - 當前正在執行一個或多個請求
Sleeping - 當前沒有執行任何請求
Dormant – 會話因連線池而被重置,並且現在處於登入前狀態。
Preconnect - 會話在資源調控器分類器中。
分類資源調控器支援對傳入會話的分類。分類基於函式中包含的一組使用者編寫的條件。
函式邏輯的結果使資源調控器可以將會話歸入現有工作負荷組類。
會話傳入連結——分類(分類器函式)——路由到工作負荷組——工作負荷組使用相關聯的資源池——資源池提供同時限制應用程式資源
bufferhit
命令
SELECT a.cntr_value * 1.0 / b.cntr_value * 100.0 AS BufferCacheHitRatio
FROM sys.dm_os_performance_counters a
JOIN (SELECT cntr_value, OBJECT_NAME
FROM sys.dm_os_performance_counters
WHERE counter_name = `Buffer cache hit ratio base`
AND OBJECT_NAME = `MSSQL$MS%d:Buffer Manager`
) b ON a.OBJECT_NAME = b.OBJECT_NAME
WHERE a.counter_name = `Buffer cache hit ratio`
AND a.OBJECT_NAME = `MSSQL$MS%d:Buffer Manager`
解釋
sys.dm_os_performance_counters 為伺服器維護的每個效能計數器返回一行。
counter_name 計數器的名稱
OBJECT_NAME 計數器的所屬類別
Buffer Manager 物件提供了計數器,用於監視 SQL Server 如何使用:
記憶體儲存資料頁、內部資料結構和過程快取。
計數器監視 SQL Server 讀取和寫入資料庫頁時的物理 I/O。
Buffer Manager中的Buffer cache hit ratio base和Buffer cache hit ratio
Buffer cache hit ratio 官方解釋在緩衝區快取記憶體中找到而不需要從磁碟中讀取的頁的百分比。
經驗
正常情況應該在99%以上
checkpoint
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Buffer Manager`
AND counter_name = `Checkpoint pages/sec`
解釋
由要求重新整理所有髒頁的檢查點或其他操作每秒重新整理到磁碟的頁數。
經驗
1. 顯示執行 checkpoint;會發生checkpoint
2. alter database 新增或刪除資料庫檔案;會發生checkpoint
3. 停止服務;會發生checkpoint
4. engine定期生成checkpoint,跟recovery interval、恢復模式相關
5. 備份;會發生checkpoint
6. 在資料庫中執行了最小日誌記錄操作,例如,在使用大容量日誌恢復模式的資料庫中執行大容量複製操作;會發生checkpoint
7 執行了需要關閉資料庫的活動。例如,AUTO_CLOSE 設定為 ON 並且關閉了資料庫的最後一個使用者連線,或者執行了需要重新啟動資料庫的資料庫選項更改;會發生checkpoint
8. 08R2 checkpoint是例項級別的配置,但進行的過程(實現方式)是資料庫級別的,這個msdn沒有詳細說明但可以做實驗證明,大概方法可以構造兩個資料庫和相應資料,不同的DB session手動執行checkpoint觀察sys.dm_os_buffer_descriptors
9. 髒頁的多少影響checkpoint開銷大小
10. 08R2映象端不支援checkpoint
pagelife
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Buffer Manager `
AND counter_name = `Page life expectancy`
解釋
表示頁面在快取中的預期"壽命",單位為秒。微軟建議最少300秒。如果在一個例項中經常低於300秒,意味著資料保留的時間少於5分鐘就被移出記憶體。
經驗
1. 正常PLE應該是大於300且為一條持續平穩上升的直線
2. PLE經常性的波動可能是記憶體壓力的訊號,具體再結合lazy_write,page_writes/page_reads等一起觀察判定
sqlcompilations
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:SQL Statistics`
AND counter_name = `SQL Compilations/sec`
解釋
每秒的 SQL 編譯數。 表示編譯程式碼路徑被進入的次數。 包括 SQL Server 中語句級重新編譯導致的編譯。 當 SQL Server 使用者活動穩定後,該值將達到穩定狀態。
經驗
編譯截斷主要是CPU開銷,一般可以和Batch Requests/sec對照來看
logins
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:General Statistics`
AND counter_name = `Logins/sec`
解釋
General Statistics 物件提供計數器,用於監視伺服器範圍內的常規活動
Logins/sec 每秒啟動的登入數。 這不包括已入池連線。
transactions
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE `MSSQL$MS%d:database%%`
AND instance_name = `_Total`
AND counter_name LIKE `Transactions/sec%%`
解釋
Database 物件提供了計數器,來監視大容量複製操作、備份和還原吞吐量以及事務日誌活動。
_Total 有的計數器的instance_name中有值為_Total的例項,它是對該計數器所有例項的聚合值(SUM)。
Transactions/sec 每秒為資料庫啟動的事務數
經驗
理解SQLServer的Transactions和Batch Requests,一個Batch Requests可能有多個Transactions,Batch Requests更能說明系統負載
locktimeout
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Locks`
AND counter_name = `Lock Timeouts/sec`
AND instance_name = `_Total`
解釋
Locks 物件提供了有關各種資源型別的 SQL Server 鎖的資訊
Lock Timeouts/sec 每秒超時的鎖請求數,包括對 NOWAIT 鎖的請求。
deadlock
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Locks`
AND counter_name = `Number of Deadlocks/sec`
AND instance_name = `_Total`
解釋
Number of Deadlocks/sec 每秒導致死鎖的鎖請求數。
經驗
經常死鎖可能會導致嚴重的問題,藉助Profiler可以解,但在RDS場景下最好的處理方式是開啟Flag 1222 通過日誌分析
lockwaits
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Locks`
AND counter_name = `Lock Waits/sec`
AND instance_name = `_Total`
解釋
Lock Waits/sec 每秒要求呼叫者等待的鎖請求數。
fullscans
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Access Methods`
AND counter_name = `Full Scans/sec`
解釋
Access Methods 物件提供用於監視如何訪問資料庫中的邏輯資料的計數器。
Full Scans/sec 每秒不受限制的完全掃描數。這些掃描可以是基表掃描,也可以是全文索引掃描。
pagesplits
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Access Methods `
AND counter_name = `Page Splits/sec`
解釋
Page Splits/sec 每秒由於索引頁溢位而發生的頁拆分數。
經驗
頁拆分會搬移資料,效能開銷,和fillfactor引數有聯絡;12相對於08有優化,碰到大條記錄拆分一次放不下可能會嘗試生成一個新頁存放,優化出現連續拆分的情況
lazy_writes
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Buffer Manager`
AND counter_name = `Lazy writes/sec`
解釋
Lazy writes/sec 每秒被緩衝區管理器的惰性編寫器寫入的緩衝區數。
惰性編寫器 一個系統程式,用於成批重新整理髒的老化的緩衝區(包含更改的緩衝區,必須將這些更改寫回磁碟,才能將緩衝區重用於其他頁),並使它們可用於使用者程式。
當SQL Server感覺到記憶體壓力的時候,會將最久沒有使用的資料頁面和執行計劃從緩衝池中清理掉,做這個動作的就是Lazy Writer。
經驗
Lazy writes有單獨一個系統程式,刷髒頁的過程和checkpoint類似同樣會有效能影響,對比checkpoint可以理解為兩者的行為類似但目的不同,Lazy writes是保證記憶體有可用頁,一般有記憶體壓力的時候會頻繁出現,Checkpoint聚合寫、優化IO、維護資料一致性,可以結合PLE一起觀察記憶體問題
pagereads
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Buffer Manager `
AND counter_name = `Page reads/sec`
理解
Page reads/sec 每秒發出的物理資料庫頁讀取數。
經驗
大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的SQL或者考慮增加記憶體,當然記憶體是有成本的最好的方式還是通過rewrite queries/add intelligent indexes處理;
pagewrite
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:Buffer Manager`
AND counter_name = `Page writes/sec`
理解
Page writes/sec 每秒執行的物理資料庫頁寫入數。
經驗
大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的SQL或者考慮增加記憶體,當然記憶體是有成本的最好的方式還是通過rewrite queries/add intelligent indexes處理;
qps
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%d:SQL Statistics`
AND counter_name = `Batch Requests/sec`
理解
SQL Statistics 物件提供計數器來監視編譯和傳送到 SQL Server 例項的請求型別。通過監視查詢編譯和重新編譯的次數以及 SQL Server 例項收到的批數,可瞭解 SQL Server 處理使用者查詢的速度,以及查詢優化器處理查詢的效率。
Batch Requests/sec 每秒收到的 Transact-SQL 命令批數。
經驗
這個Batch Requests跟MySQL的QPS不同,SQLServer一個Batch Requests可能包含多個Transactions
traffic_kb
命令
SELECT round(SUM(net_packet_size * 1.0 * num_reads / 1024), 0) AS read_kb, round(SUM(net_packet_size * 1.0 * num_writes / 1024), 0) AS write_kb
FROM sys.dm_exec_connections
WHERE session_id > 50
理解
dm_exec_connections 返回與 SQL Server 例項建立的連線有關的資訊以及每個連線的詳細資訊。
net_packet_size 用於資訊和資料的網路包的大小。可為 Null 值。
num_reads 此連線中已發生的讀包次數。可為 Null 值。
num_writes 此連線中已發生的寫資料包次數。可為 Null 值。
session_id 標識與此連線關聯的會話。可為 Null 值。
db_io
命令
SELECT SUM(fs.num_of_reads + fs.num_of_writes) AS [mssql_db_log_io]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS f
ON fs.database_id = f.database_id
AND fs.file_id = f.file_id
INNER JOIN sys.databases AS d
ON d.database_id = f.database_id
AND d.name IN (%s) GROUP BY d.name ORDER BY d.name
解釋
sys.dm_io_virtual_file_stats 返回資料和日誌檔案的 I/O 統計資訊。
num_of_reads 對檔案發出的讀取次數。
num_of_writes 在該檔案中寫入的次數。
sys.master_files 儲存在 master 資料庫中的每個資料庫檔案都在表中佔用一行。
database_id 應用此檔案的資料庫的 ID。master database_id 始終為 1。
file_id 資料庫內檔案的 ID。主 file_id 始終為 1
sys.databases 例項中的每個資料庫都對應一行
name 資料庫名稱
activesession
命令
select COUNT(*)
from sys.dm_exec_sessions
where login_name not in (`root`,`aurora`,`sa`, `eagleye`)
and login_name not like `s\_%` escape ``
and login_name not like `%mssqld`
and login_name not like `%Administrator`
and status not in (`Preconnect`, `Dormant`, `Sleeping`)
and session_id > 50
解釋
比之前的session監控多了Sleeping和session_id>50的過濾條件
Sleeping 當前沒有執行任何請求
經驗
activesession過高一般業務都會出現卡慢,但這個值只是一個結果表現,具體導致原因還需要其它進一步排查
connectionreset
命令
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = `MSSQL$MS%s:General Statistics`
AND counter_name = `Connection Resets/sec`
解釋
Connection Resets/sec 從連線池啟動的登入總次數。
相關文章
- SQLSERVER 資料庫效能的基本SQLServer資料庫
- SQLSERVER 資料庫效能的的基本SQLServer資料庫
- 在不同的資料庫中解析SQLServer資料資料庫SQLServer
- SQLServer效能優化之 nolock,大幅提升資料庫查詢效能SQLServer優化資料庫
- sqlserver資料庫系統效能監控步驟SQLServer資料庫
- 資料庫優化效能解析資料庫優化
- 深入解析面向資料的雜湊表效能
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- SQLServer批量新增資料庫SQLServer資料庫
- SQLServer的資料型別SQLServer資料型別
- SQLServer解析xml到OracleSQLServerXMLOracle
- SqlServer資料庫資料恢復報告SQLServer資料庫資料恢復
- sqlserver建立資料流操作來導資料SQLServer
- 關於SqlServer資料表操作SQLServer
- SQLServer移動資料檔案SQLServer
- SQLserver本地資料庫開發SQLServer資料庫
- ThinkPHP連線sqlserver資料庫PHPSQLServer資料庫
- SQLserver備份資料庫示例SQLServer資料庫
- (轉)sqlserver 資料恢復方法SQLServer資料恢復
- Sqlserver:timestamp資料型別SQLServer資料型別
- SQLserver 監控資料檔案SQLServer
- jmeter 連線 sqlserver 資料庫JMeterSQLServer資料庫
- SQLServer的常用資料型別SQLServer資料型別
- Jtti:sqlserver怎麼清空資料庫資料JttiSQLServer資料庫
- 【SqlServer】 理解資料庫中的資料頁結構SQLServer資料庫
- SqlServer資料庫恢復備份資料的方法SQLServer資料庫
- 資料解析
- 如何提升SQLServer Delete資料的效率SQLServerdelete
- sqlserver 資料庫收縮的方法SQLServer資料庫
- SQLServer查詢所有資料庫大小SQLServer資料庫
- SQLSERVER學習1——資料庫概念SQLServer資料庫
- sqlserver查詢長括號[資料SQLServer
- 新增時--sqlserver資料庫跟蹤SQLServer資料庫
- Android連線資料庫sqlserverAndroid資料庫SQLServer
- JDBC之連線sqlserver資料庫JDBCSQLServer資料庫
- 將Excel的資料更新至SqlServerExcelSQLServer
- Sqlserver資料寫入表測試SQLServer
- 【永春】往Sqlserver插入資料包錯SQLServer