对于具有多个辅助文件(例如.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_spaceused
,sys.dm_db_index_physical_stats
和sys.dm_db_partition_stats
的源代码。这些似乎都没有办法产生这个答案,或者至少我不知道如何利用它们。
有什么想法吗?
我正在使用各种不同的SQL Server版本(2012、2014、2016和2017)。我很喜欢与他们所有人在一起的东西。