Eu esperava obter uma visão granular de quais arquivos de banco de dados continham quais unidades de alocação para os vários HoBTs (alinhados e não alinhados) vivendo em um banco de dados.
A consulta que eu sempre usei (veja abaixo) me serviu bem até que começamos a criar vários arquivos de dados por grupo de arquivos e só consigo descobrir como obter uma granularidade como o nível do grupo de arquivos.
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;
No entanto, essa consulta não funcionará quando houver vários arquivos em um grupo de arquivos, pois só posso relacionar uma unidade de alocação a um espaço de dados e, finalmente, a um grupo de arquivos. Gostaria de saber se há outro DMV ou catálogo que esteja faltando que possa ser usado para identificar melhor qual arquivo no grupo de arquivos contém uma unidade de alocação.
A questão por trás dessa pergunta é que estou tentando avaliar os efeitos reais da compactação de estruturas particionadas. Sei que posso usar FILEPROPERTY(FileName,'SpaceUsed')
o antes e o depois do arquivo e o antes e o depois sys.allocation_units.used_pages/128.
para obter essas informações, mas o exercício em si me fez pensar se eu conseguiria identificar o arquivo específico que contém uma unidade de alocação específica.
Eu tenho mexido com %%physloc%%
a esperança de que isso possa ajudar, mas isso não me dá o que estou procurando. Os links abaixo foram fornecidos por Aaron Bertrand :
Respostas:
Tente a seguinte consulta. Primeiro, ele cria uma tabela temporária local e a preenche com as associações AllocationUnitID para FileID encontradas em
sys.dm_db_database_page_allocations
uma DMF (Dynamic Management Function) não documentada, introduzida no SQL Server 2012 (para versões anteriores a 2012, você pode obter essas informaçõesDBCC IND()
). Essa tabela temporária local é JOINed em uma versão modificada da consulta original.Os dados desse DMF são colocados em uma tabela temporária para desempenho, pois, dependendo do tamanho do banco de dados, pode levar mais de alguns segundos para obter esses dados. A
DISTINCT
palavra-chave é usada porque o DMF retorna uma linha por página de dados e há várias páginas de dados por cada unidade de alocação.Deixei JOIN esses dados na consulta original, pois a consulta original retorna unidades de alocação que possuem 0 páginas de dados (normalmente
ROW_OVERFLOW_DATA
eLOB_DATA
tipos). Também adicionei ototal_pages
campo para que fosse mais fácil relacionar esse ponto de dados às linhas que possuemNULL
s para os arquivos de dados. Se você não se importa com as Unidades de Alocação que possuem 0 linhas, seria bom alterar issoLEFT JOIN
para umINNER JOIN
.fonte
Remus Rusanu, em 21 de maio de 2013, forneceu uma resposta para esta pergunta:
Um grupo de arquivos, vários arquivos de dados, como obter a lista de tabelas em cada arquivo
Sua resposta foi:
fonte