每个数据库文件的报告索引大小

时间:2018-08-27 22:14:21

标签: sql-server tsql

对于具有多个辅助文件(例如.NDF文件)的给定数据库,我想知道每个用户生成的索引PER DB FILE的空间分配指标(保留,使用等)。下面是我构造的查询,起初,我以为正是我想要的。

SELECT  
    DF.name AS FileAlias, 
    SCHEMA_NAME(T.schema_id) AS [Schema], 
    T.name AS TableName, 
    sPTN.partition_number AS Part, 
    I.index_id, 
    sPTN.rows, 
    TField, --"Type" bit field: bit 1 = IN_ROW, bit 2 = LOB, bit 3 = ROW_OVERFLOW 
    total_pages / 128.0 AS ReservedMB, 
    used_pages / 128.0 AS UsedMB, 
    data_pages / 128.0 AS PagesMB, 
    I.name AS IndexName  
FROM sys.partitions AS sPTN  
    CROSS APPLY (  
        SELECT   
            a.data_space_id, 
            SUM(total_pages) AS total_pages,   
            SUM(used_pages) AS used_pages,   
            SUM(data_pages) AS data_pages,  
            SUM(DISTINCT POWER(2,type-1)) AS TField  
        FROM sys.allocation_units a  
        --see MSDN sys.allocation_units article, regarding field "container_id" for explanation. 
        WHERE a.type IN (1,3) AND a.container_id = sPTN.hobt_id OR a.type = 2 AND a.container_id = sPTN.partition_id 
        GROUP BY a.container_id, a.data_space_id  
        ) AU 
    JOIN sys.database_files DF ON DF.data_space_id = AU.data_space_id 
    JOIN sys.indexes I ON I.object_id = sPTN.object_id AND I.index_id = sPTN.index_id 
    JOIN sys.tables T ON T.object_id = I.object_id 
WHERE T.is_ms_shipped = 0 
ORDER BY 2,3,5,1,4 

不幸的是,对于任何给定的索引,该查询为我提供了每个数据库文件相同的大小。这个结果令人难以置信。每个索引使用的空间在每个文件之间至少会略有不同。此外,如果我对所有文件的所有大小指标求和...我得到的数字对于每个索引的总大小几乎是完全准确的。换句话说,似乎我的查询是以某种方式返回每个文件每个索引的“平均”大小。

我研究了sys.sp_spaceusedsys.dm_db_index_physical_statssys.dm_db_partition_stats的源代码。这些似乎都没有办法产生这个答案,或者至少我不知道如何利用它们。

有什么想法吗?

我正在使用各种不同的SQL Server版本(2012、2014、2016和2017)。我很喜欢与他们所有人在一起的东西。

0 个答案:

没有答案