我希望能够详细了解哪些数据库文件包含数据库中各种 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%%
希望它能有所帮助,但它并不能完全满足我的需求。以下链接由Aaron Bertrand提供:
- 我的行在哪里?– 使用 %%physloc%% 虚拟列(sqlity.net)
- SQL Server 2008:Paul Randal的新(未记录的)物理行定位器函数