J'espérais obtenir une vue granulaire des fichiers de base de données qui contenaient quelles unités d'allocation pour les différents HoBT (alignés et non alignés) vivant dans une base de données.
La requête que j'ai toujours utilisée (voir ci-dessous) m'a bien servi jusqu'à ce que nous commencions à créer plusieurs fichiers de données par groupe de fichiers et je ne suis capable de comprendre que comment être aussi granulaire que le niveau du groupe de fichiers.
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;
Cependant, cette requête ne fonctionnera pas lorsqu'il y a plusieurs fichiers dans un groupe de fichiers car je ne peux obtenir que la relation entre une unité d'allocation et un espace de données et, finalement, un groupe de fichiers. Je voudrais savoir s'il y a un autre DMV ou catalogue qui me manque que je peux utiliser pour identifier plus en détail le fichier dans le groupe de fichiers qui contient une unité d'allocation.
La question derrière cette question est que j'essaie d'évaluer les effets réels de la compression des structures partitionnées. Je sais que je peux faire une utilisation avant et après FILEPROPERTY(FileName,'SpaceUsed')
pour le fichier et un avant et après sys.allocation_units.used_pages/128.
pour obtenir ces informations, mais l'exercice lui-même m'a fait me demander si je pouvais identifier le fichier spécifique qui contient une unité d'allocation spécifique.
J'ai joué avec %%physloc%%
dans l'espoir que cela pourrait aider, mais cela ne m'a pas tout à fait ce que je cherche. Les liens ci-dessous ont été fournis par Aaron Bertrand :
Réponses:
Essayez la requête suivante. Il crée d'abord une table temporaire locale, puis la remplit avec les associations AllocationUnitID-FileID trouvées dans
sys.dm_db_database_page_allocations
, une fonction de gestion dynamique (DMF) non documentée introduite dans SQL Server 2012 (pour les versions antérieures à 2012, vous pouvez obtenir ces informations auprès deDBCC IND()
). Cette table temporaire locale est ensuite jointe en une version modifiée de la requête d'origine.Les données de ce DMF sont placées dans une table temporaire pour les performances car, selon la taille de la base de données, l'obtention de ces données peut prendre plus de quelques secondes. le
DISTINCT
mot clé est utilisé parce que DMF renvoie une ligne par page de données et qu'il existe plusieurs pages de données par unité d'allocation.J'ai joint ces données dans la requête d'origine, car la requête d'origine renvoie des unités d'allocation qui ont 0 pages de données (généralement
ROW_OVERFLOW_DATA
etLOB_DATA
types). J'ai également ajouté letotal_pages
champ afin qu'il soit plus facile de relier ce point de données aux lignes qui ont desNULL
s pour les fichiers de données. Si vous ne vous souciez pas des unités d'allocation qui ont 0 lignes, alors ce serait bien de changer celaLEFT JOIN
pour être unINNER JOIN
.la source
Remus Rusanu, le 21 mai 2013, a répondu à cette question:
Un groupe de fichiers, plusieurs fichiers de données, comment obtenir la liste des tables dans chaque fichier
Sa réponse a été:
la source