Размер индекса отчета на файл БД - PullRequest
0 голосов
/ 28 августа 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...