1. 程式人生 > >文件的空間使用和IO統計

文件的空間使用和IO統計

rop 掃描 tab study ext 頁面 flow cati 性能

數據庫占用的存儲空間,從高層次來看,可以查看數據庫文件(數據文件,日誌文件)占用的存儲空間,從較細的粒度上來看,分為數據表,索引,分區占用的存儲空間。監控數據庫對象占用的硬盤空間,包括已分配,未分配,和未使用的空間占比,能夠有效地管控存儲空間,合理利用,避免部分文件空間不足,而其他文件浪費空間的問題。

一,數據庫文件占用的存儲空間

1,查看數據庫的各個文件占用的存儲空間

技術分享 View Code

2,查看數據文件中已分配,未分配和混合區的空間

視圖:sys.dm_db_file_space_usage 以Page為單位,實際上,Page的計數都是在區(Extent)級別上統計的,數據文件不夠GAM(Global Allocation Map)和SGAM(Shared Global Allocation Map)。

技術分享
select db_name(mf.database_id) as db_name
    ,su.file_id
    ,su.filegroup_id
    ,mf.name as file_logic_name
    ,su.total_page_count*8/1024/1024 as total_gb
    ,su.allocated_extent_page_count*8/1024/1024 as allocated_gb
    ,su.unallocated_extent_page_count*8/1024/1024 as unallocated_gb
    ,su.mixed_extent_page_count*8/1024 as mixed_mb
from sys.dm_db_file_space_usage su
inner join sys.master_files mf
    on su.database_id=mf.database_id
        and su.file_id=mf.file_id
技術分享

還有一個DBCC命令返回相同的數據,該命令以區(Extent)為單位,統計數據庫的文件上已分配的,未分配的區的數量:

 dbcc showfilestats

該命令從系統page:GAM 和 SGAM 上讀取Extent的分配信息

3,使用查看當前數據庫的空間使用量

exec sys.sp_spaceused

技術分享

數據庫的空間利用信息:

  • database_size數據文件和日誌文件的大小;database_size 會比 reserved + unallocated space的加和大,這是因為 reservedunallocated_space 僅僅是數據文件的大小;
  • unallocated space
    :數據文件中的未分配空間雖然占用文件的硬盤空間,但是,沒有分配,不能被其他數據庫對象使用;
  • reserved:數據文件中的保留空間,是已經分配的硬盤空間,能夠被其他數據庫對象使用;
  • data:數據占用的硬盤空間;
  • index_size索引占用的硬盤空間;
  • unused :已經分配,但是未被使用的硬盤空間;

4, 統計SQL Server 實例中所有數據庫的日誌文件的硬盤空間使用

dbcc sqlperf(logspace) 返回的結果總是準確的,語句的執行不會增加系統負擔

dbcc sqlperf(logspace)

技術分享

二,查看數據庫中,各個數據表或索引所占用的硬盤空間

1,查看數據庫所有數據庫表或索引所占用的硬盤空間

技術分享
;with cte_space as 
(
    select 
        ps.object_id
        ,sum(case when ps.index_id<2 then ps.row_count else 0 end) as row_count
        ,sum(ps.reserved_page_count)*8/1024/1024 as reserved_gb
        ,sum(ps.used_page_count)*8/1024/1024 as used_gb
        ,sum(case when ps.index_id<2
                    then ps.in_row_data_page_count+ps.lob_used_page_count+ps.row_overflow_used_page_count
                  else 0 end
            )*8/1024/1024 as data_used_gb
    from sys.dm_db_partition_stats ps with(nolock)
    inner join sys.tables t  with(nolock)
        on ps.object_id=t.object_id
    group by ps.object_id
)
select object_schema_name(s.object_id)+‘.‘+object_name(s.object_id) as table_name
    ,s.row_count
    ,s.reserved_gb
    ,s.used_gb
    ,s.data_used_gb
    ,s.used_gb-s.data_used_gb as index_used_gb
    ,s.reserved_gb-s.used_gb as unused_gb
from cte_space s
where s.reserved_gb>1  -- more than 512MB
order by used_gb desc
    ,index_used_gb desc
技術分享

2,以索引為單位,查看數據表上各個索引占用的硬盤空間

技術分享 View Code

3,在當前DB中,查看某一個數據表的空間使用信息

該存儲過程用於查看當前數據庫數據表的空間使用,返回的結果並不精確,默認情況下,該存儲過程底層使用系統視圖 sys.allocation_unitssys.partitions 獲取數據表的所占用空間的“近似”信息。當索引被刪除、索引被重建、或者大表被刪除(drop,truncate)時,數據庫引擎會延遲Page的釋放,延遲刪除導致不會立即釋放已分配的空間,在這種情況下,該存儲過程不會立即返回精確的空間使用信息。

exec sys.sp_spaceused ‘dbo.dt_study‘

技術分享

  • rows::數據表的總行數;
  • reserved:數據文件中已分配的空間;
  • data:數據文件中,基礎表占用的空間;
  • index_size:數據文件中,索引占用的空間;
  • unused:數據文件中,已分配,但是為被數據庫對象(基礎表和索引)使用的空間;

三,查看服務器各個邏輯盤符剩余的硬盤空間

Exec master.sys.xp_fixeddrives

技術分享

四,壓縮文件

在SQL Server中,使用 DBCC ShrinkFile命令壓縮數據庫文件(數據文件和日誌文件),或直接把數據庫文件清空。除非硬盤空間不足,不要輕易收縮數據庫的文件,這會打亂索引的物理順序,大幅增加的索引外部碎片,影響查詢性能。

在執行DBCC ShrinkFile命令,收縮數據文件的時候,數據庫引擎首先把文件尾部的區(Extent)移動到文件的開頭,然後釋放文件末尾的空閑空間,歸還給操作系統。在移動Page時,數據庫引擎會掃描數據文件並對正在讀取的頁面加鎖,對數據庫的性能會有所影響。但是收縮操作不是一個獨占行為,其他用戶仍然可以對數據庫進行讀寫操作。在進程中的任意一個時間點停止文件收縮操作,任何已經完成的工作都將保留。

收縮文件以區為單位,它會把文件末尾已分配的區前移,把未分配的區從文件末尾移除。該命令不會把一個區裏面的空閑頁面(empty page)移除,也不會合並區以釋放空閑頁面,如果數據庫中有很多只使用了一兩個頁面的區,DBCC SHRINKFILE的效果會不明顯。

DBCC SHRINKFILE ( { file_name | file_id }, EMPTYFILE )
DBCC SHRINKFILE ( { file_name | file_id }, target_size , { NOTRUNCATE | TRUNCATEONLY } )

1,參數說明

target_size :是整數類型,單位是MB,數據庫引擎嘗試把文件收縮到指定的大小(Size),但不會收縮到小於數據實際存儲必需的空間。只有和參數NOTRUNCATE搭配使用,才起作用。

EMPTYFILE :把數據從指定的文件遷移到同一個文件組中的其他文件中,也就是說,把當前文件清空,把數據轉存到其他文件中,數據的遷移只能在同一個文件組的不同文件之間進行。數據文件被清空之後,數據庫引擎不會把數據存儲到空文件中,可以使用 ALTER DATABASE 把文件從數據庫中移除。

NOTRUNCATE:只用於數據文件,對日誌文件不起作用;該參數用於把已分配(Allocated)的區(Extent)從數據文件的末尾移動到數據文件開頭的未分配(Unallocated)的空間中,文件末尾被釋放的空間不會返回給操作系統,仍然存在於文件中,處於未分配狀態,這意味著數據庫文件占用的存儲空間不變。和target_size參數一起使用,用於指定文件收縮的大小。由於區(Extent)的移動是IO密集型操作,會影響數據庫的IO性能。

TRUNCATEONLY:把文件末尾的所有空閑空間都釋放,返回給操作系統,該參數不會執行任何的Page移動,也就是說,該參數收縮數據庫文件,而忽略target_size參數,收縮的硬盤空間以區(Extent)為單位。

2,收縮文件示例

想要收縮數據庫文件,釋放硬盤空間,需要分兩步:先移動,後釋放

Step1,將文件末尾已分配的區(extent)向前移動,移動到文件前端未被分配的區中,移動的區被標記為未分配(Unallocated)

dbcc shrinkfile(‘filename‘,0,notruncate)

Step2,將文件末尾的空閑空間(以區為單位)釋放,歸還給操作

dbcc shrinkfile(‘filename‘,target_size_MB,truncateonly)

五,IO請求的等待和掛起

數據庫引擎記錄對數據文件和日誌文件的IO操作,緩存到函數:sys.dm_io_virtual_file_stats,對於數據文件,數據的物理讀操作更為重要;對於日誌文件,數據的讀寫操作都重要:

  • io_stall_read_ms:等待讀操作的時間
  • io_stall_write_ms:等待寫操作的時間

如果硬盤繁忙,數據庫引擎發送的IO請求,可能會被IO子系統掛起(pending),數據庫引擎把pending的IO請求緩存到視圖:sys.dm_io_pending_io_requests,

  • io_pending:指定是否有IO請求掛起或完成

1,查看數據庫文件的IO和等待IO完成的時間

技術分享 View Code

2,查看pending的IO請求

技術分享 View Code

參考文檔:

sp_spaceused

sys.dm_db_file_space_usage (Transact-SQL)

sys.dm_db_partition_stats (Transact-SQL)

文件的空間使用和IO統計