对于分区表,SQL Server内部使用分区ID(PartitionID)唯一标识一个分区,对于任何一个对象(table,index 或 indexed view),每一个分区都有一个分区编号(Prtition number),该编号在对象的索引上是唯一的,用于标记基础表或索引视图的一个分区。
一,查看分区
通过系统视图:sys.partitions 查看分区对象(Table或index)的基本信息,在该视图中,如果index_id=0,表示基础表(Underlying Table)是堆(Heap)结构,堆表是没有创建的聚集索引的存储结构;如果index_id=1,表示基础表是平衡树(B-Tree)结构,在堆表上创建聚集索引,可以把堆表结构转换为平衡树(B-Tree)结构;如果index_id>1,表示索引是非聚集索引。由于基础表要么是堆表结构,要么是B-Tree结构,因此,index_id只会是0,或者1,不可能同时存在1和0。
data_compression 字段表示每个分区的数据压缩类型,rows字段表示每个分区的近似的数据总行数。通过统计rows字段,能够快速统计基础表近似的总的数据行数量,设置条件 index<=1,表示只统计聚集索引或堆表的总数据行数量。
select sum(rows) as ApproximateTotalRows from sys.partitions where object_id=object_id('xx.yyy','U') and index_id<=1
二,统计每个分区占用的存储空间
在做分区时,应尽量保证每个分区的数据行总量均匀分布,每个分区占用的存储空间均匀分布,避免单个分区过大,系统视图 sys.dm_db_partition_stats 能够查看每个分区所占用的Pages数量。
select ps.partition_id, ps.object_id, ps.index_id, ps.partition_number, ps.in_row_data_page_count, ps.in_row_used_page_count, ps.in_row_reserved_page_count, ps.lob_used_page_count, ps.lob_reserved_page_count, ps.row_overflow_used_page_count, ps.row_overflow_reserved_page_count, ps.used_page_count, ps.reserved_page_count, ps.row_count from sys.dm_db_partition_stats ps
where ps.object_id=object_id('xx.xx','U')
统计每个分区对象的占用的总的Pages数量
select ps.object_id, ps.index_id, sum(ps.in_row_data_page_count) as data_pages, sum(ps.used_page_count) as used_pages, sum(ps.reserved_page_count) as reserved_pages from sys.dm_db_partition_stats ps where ps.object_id=object_id('xx.xx','U') group by ps.object_id,ps.index_id
三,查看每个分区的分配单元(Allocation Unit)
SQL Server为每个分区分配了一个分配单元(allcotion unit),用于为该分区分配存储空间,通过系统内部视图:sys.system_internals_allocation_units, 能够查看该alloction unit分配的Page类型等信息。
select * from sys.system_internals_allocation_units where container_id=72057621135294464 --partition id
参考文档: