【问题标题】:Table Disk Space Usage By Filegroup and Partition in MSSQLSERVERMSSQLSERVER 中按文件组和分区划分的表磁盘空间使用情况
【发布时间】:2014-03-04 12:26:23
【问题描述】:

我在一个 MSSQLSERVER 数据库中有分区表。我可以检查一个表中的数据是如何分布在每个文件组和分区上的吗?

【问题讨论】:

    标签: sql-server tsql database-partitioning diskspace


    【解决方案1】:

    我为此找到了一个不错的脚本:

    https://web.archive.org/web/20140519033945/http://williamweber.net/table-disk-space-usage-by-filegroup-and-partition/

    SELECT
        DB_NAME() AS 'DatabaseName'
        ,OBJECT_NAME(p.OBJECT_ID) AS 'TableName'
        ,p.index_id AS 'IndexId'
        ,CASE
            WHEN p.index_id = 0 THEN 'HEAP'
            ELSE i.name
        END AS 'IndexName'
        ,p.partition_number AS 'PartitionNumber'
        ,prv_left.VALUE AS 'LowerBoundary'
        ,prv_right.VALUE AS 'UpperBoundary'
        ,CASE
            WHEN fg.name IS NULL THEN ds.name
            ELSE fg.name
        END AS 'FileGroupName'
        ,CAST(p.used_page_count * 0.0078125 AS NUMERIC(18,2)) AS 'UsedPages_MB'
        ,CAST(p.in_row_data_page_count * 0.0078125 AS NUMERIC(18,2)) AS 'DataPages_MB'
        ,CAST(p.reserved_page_count * 0.0078125 AS NUMERIC(18,2)) AS 'ReservedPages_MB'
        ,CASE
            WHEN p.index_id IN (0,1) THEN p.ROW_COUNT
            ELSE 0
        END AS 'RowCount'
        ,CASE
            WHEN p.index_id IN (0,1) THEN 'data'
            ELSE 'index'
        END 'Type'
    FROM sys.dm_db_partition_stats p
        INNER JOIN sys.indexes i
            ON i.OBJECT_ID = p.OBJECT_ID AND i.index_id = p.index_id
        INNER JOIN sys.data_spaces ds
            ON ds.data_space_id = i.data_space_id
        LEFT OUTER JOIN sys.partition_schemes ps
            ON ps.data_space_id = i.data_space_id
        LEFT OUTER JOIN sys.destination_data_spaces dds
            ON dds.partition_scheme_id = ps.data_space_id
            AND dds.destination_id = p.partition_number
        LEFT OUTER JOIN sys.filegroups fg
            ON fg.data_space_id = dds.data_space_id
        LEFT OUTER JOIN sys.partition_range_values prv_right
            ON prv_right.function_id = ps.function_id
            AND prv_right.boundary_id = p.partition_number
        LEFT OUTER JOIN sys.partition_range_values prv_left
            ON prv_left.function_id = ps.function_id
            AND prv_left.boundary_id = p.partition_number - 1
    WHERE
        OBJECTPROPERTY(p.OBJECT_ID, 'ISMSSHipped') = 0
        --AND p.index_id in (0,1)
    

    根据作者的说法,这里是对被拉入数据列的快速解释:

    默认情况下,MSSQL 中的数据页为 8KB,这是假设 我正在处理这个查询。

    Used_Pages: the number of pages actually used by the table including non-leaf B-tree pages and IAM pages.
    Reserved_Pages: is the number of pages being reserved in total for the object, whether used or not.
    Data_Pages: the number of pages being used excluding non-leaf B-tree pages.
    

    这里是 BOL 页面的链接,其中描述了这些: msdn.microsoft.com/en-us/library/ms187737.aspx

    【讨论】:

    • 链接无效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2021-10-07
    • 2013-05-18
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多