SQL Server中的I/O操作類型:
1.對於內存中沒有緩存的數據,第一次訪問時需要將數據從所在的頁面從數據文件中讀取到內存中
2.在任何Insert/Update/Delete提交前,SQL Server需要保證日志記錄能夠寫入到日志文件中
3.當SQL Server做Checkpoint時,需要將內存緩沖區中已經發生修改的數據頁面同步到硬盤的數據文件中,一般一分鍾一次Checkpoint。如果修改較多,頻率高一些,寫的數量 和上次checkpoint依賴發生的數據修改量有直接關系
4.當SQL Server Buffer Pool發生壓力時,會觸發Lazy Writer,主動將內存里的一些很久沒有使用過的數據頁面和執行計划清空。如果這些頁面上發生的修改還未由checkpoint寫回硬盤,Lazy Writer會將其寫回
5.一些特殊操作,例如DBCC Checkdb、Reindex、Updata Statistics、Backup等,會帶來較大的硬盤讀寫。這些操作應該給都發生在一些固定的時間段
數據庫級別的I/O影響:
1.Recovery Interval(sp_configure)控制着SQL Server多久進行一次checkpoint
checkpoint pages/sec(Buffer Manager)呈周期性上升
MSSQL:SQL Statistics-Batch Requests/sec:每秒鍾完成的批處理(batch)數目
MSSQL:Databases-Active Transactions:SQL Server里打開的,還沒有提交的事物數目
2.數據/日志文件的自動增長和收縮
3.數據文件里面碎片程度:頁面碎片越多,SQL Server就需要讀取和寫入更多的頁面,增加硬盤讀寫量
4.表格上的索引結構
5.數據文件和日志文件分開放在不同的磁盤上。如果可能的話,日志文件要放在寫入速度較快的磁盤上
6.一個數據文件組是否有多個文件,並且放在不同的磁盤上。但是對於日志文件,在一個時間點,SQL Server只會寫一個日志文件,所以在不同磁盤上創建多個日志文件對性能沒有任何提高
系統級別的I/O影響:
%Disk Time:只觀察其曲線趨勢,值本身沒有參考價值
%idle Time:磁盤處於空閑狀態百分比。當磁盤處於空閑狀態時,值為100%。當磁盤滿負荷操作時,值為0,所以可以根據該值反推%Disk Time
Disk Bytes/sec:每秒鍾磁盤讀和寫總量(磁盤的吞吐量)。需要先確認該磁盤的最大讀寫速度才有參考價值,可以看出是否已經達到了該磁盤的讀寫上限
Avg.disk sec/transfer:磁盤每一次讀或寫的動作所花的平均時間
Avg.Disk Queue Length:發出的磁盤操作正在等待被磁盤處理的請求數目。理論上講,這個值不應該長時間大於2
Current Disk Queue Length:當前正在等待被磁盤處理的請求數目
當Avg.Disk Queue Length高時,需要分別觀察Disk Bytes/sec和Avg.disk sec/transfer哪個計數器已經達到了其最大值
SQL Server中的性能計數器
Buffer Manager:
Page Reads/sec和Page Writes/sec:每秒鍾讀寫了多少頁面。了解到由於Buffer Pool的行為帶來了多少磁盤讀寫
Lazy Writes/sec:Lazy Writer為了清空Buffer Pool每秒鍾做了多少頁面寫入操作
Checkpoint Writes/sec:每秒鍾從Buffer Pool里寫入到磁盤上的Dirty Page數目
Freespace Scans/sec:在堆(heap)結構里找能夠使用的空間。對於沒有聚集索引的表格,SQL Server會以堆的形式存儲。如果該值很高,應該多建立一些聚集索引
Full Scans/sec:每秒鍾SQL Server做全表掃描數目,該值越小越好
Databases(Log Activity):
Log Flush Wait Time:寫入日志的動作曾經因為磁盤來不及響應而遇到的等待時間,會導致前端的事務不能提交,會嚴重影響SQL Server性能。該值應該在絕大多數時間都為0
Log Flush Waits/sec:在每秒提交的事務里,有多少個事務曾經等待過日志寫入完成。理想情況下,日志寫入應該立刻完成,不需要等待。