Я надеялся получить детальное представление о том, какие файлы базы данных содержат какие единицы размещения для различных HoBT (как выровненных, так и не выровненных), находящихся в базе данных.
Запрос, который я всегда использовал (см. Ниже), хорошо меня обслуживал, пока мы не начали создавать несколько файлов данных на файловую группу, и я могу только выяснить, как получить такой же уровень детализации, как на уровне файловой группы.
select
SchemaName = sh.name,
TableName = t.name,
IndexName = i.name,
PartitionNumber = p.partition_number,
IndexID = i.index_id,
IndexDataspaceID = i.data_space_id,
AllocUnitDataspaceID = au.data_space_id,
PartitionRows = p.rows
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.partition_id
join sys.indexes i
on i.object_id = p.object_id
and i.index_id = p.index_id
join sys.tables t
on p.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
where sh.name != 'sys'
and au.type = 2
union all
select
sh.name,
t.name,
i.name,
p.partition_number,
i.index_id,
i.data_space_id,
au.data_space_id,
p.rows
from sys.allocation_units au
join sys.partitions p
on au.container_id = p.hobt_id
join sys.indexes i
on i.object_id = p.object_id
and i.index_id = p.index_id
join sys.tables t
on p.object_id = t.object_id
join sys.schemas sh
on t.schema_id = sh.schema_id
where sh.name != 'sys'
and au.type in (1,3)
order by t.name, i.index_id,p.partition_number;
Однако этот запрос не будет работать, когда в файловой группе несколько файлов, так как я могу только добраться до того, чтобы связать единицу выделения с пространством данных и, в конечном счете, с файловой группой. Я хотел бы знать, есть ли другой DMV или каталог, который мне не хватает, который я могу использовать для дальнейшей идентификации, какой файл в файловой группе содержит единицу выделения.
Вопрос, стоящий за этим вопросом, заключается в том, что я пытаюсь оценить реальные последствия сжатия секционированных структур. Я знаю, что могу сделать до и после использования FILEPROPERTY(FileName,'SpaceUsed')
для файла и до и после, sys.allocation_units.used_pages/128.
чтобы получить эту информацию, но само упражнение заставило меня задуматься, могу ли я определить конкретный файл, который содержит конкретную единицу выделения.
Я возился с %%physloc%%
надеждой, что это может помочь, но это не совсем дает мне то, что я ищу. Ссылки ниже предоставлены Аароном Бертраном :
Ответы:
Попробуйте следующий запрос. Сначала он создает локальную временную таблицу, а затем заполняет ее ассоциациями AllocationUnitID-to-FileID, найденными в
sys.dm_db_database_page_allocations
недокументированной динамической функции управления (DMF), введенной в SQL Server 2012 (для версий до 2012 г. эту информацию можно получить изDBCC IND()
). Эта локальная временная таблица затем присоединяется к измененной версии исходного запроса.Данные из этого DMF помещаются во временную таблицу для повышения производительности, поскольку, в зависимости от размера базы данных, получение этих данных может занять более нескольких секунд.
DISTINCT
Используется ключевое слово , потому что ДМФ возвращает одну строку для каждой страницы данных, и существует множество страниц данных в каждой единице выделения.Я оставил эти данные в исходном запросе, так как исходный запрос возвращает единицы размещения, которые имеют 0 страниц данных (обычно
ROW_OVERFLOW_DATA
иLOB_DATA
типов). Я также добавил этоtotal_pages
поле, чтобы было проще связать эту точку данных со строками, имеющимисяNULL
для файлов данных. Если вам не нужны единицы размещения, имеющие 0 строк, было бы неплохо изменить этоLEFT JOIN
значение наINNER JOIN
.источник
Ремус Русану 21 мая 2013 года дал ответ на этот вопрос:
Одна файловая группа, несколько файлов данных, как получить список таблиц в каждом файле
Его ответ был:
источник