Для данной базы данных, которая имеет несколько вторичных файлов (например, файлы .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). Я хотел бы что-то, что работает со всеми из них.