如何在对象所在的文件组中查找特定文件

SQL*_*DBA 5 sql-server filegroups sql-server-2012 index-maintenance

今天,我在我管理的一个 SQL Server 上遇到了以下错误。

无法为数据库 '%.*ls' 中的对象 '%.*ls'%.*ls 分配空间,因为 '%.*ls' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。

它发生在索引重组操作期间。经过调查,我发现我的数据库被分成 3 个文件组,其中有多个文件。他们都至少有一个启用了自动增长的文件,并且托管它们的磁盘有足够的可用空间。那么为什么我的索引维护失败了呢?我的研究使我找到了这篇 MS 文章https://msdn.microsoft.com/en-us/library/aa337441.aspx,其中说:

当一个索引位于多个文件时,当其中一个文件已满时,ALTER INDEX REORGANIZE 会返回错误 1105。当进程尝试将行移动到完整文件时,重组进程被阻止。要解决此限制,请执行 ALTER INDEX REBUILD 而不是 ALTER INDEX REORGANIZE 或增加任何已满文件的文件增长限制。

好的。所以解决方案是重建索引,使其移动到新文件。但是,如果我想继续将索引保存在同一个文件中,以便我的重组可以继续,该怎么办?那可能吗?另外,是否可以找出我的数据库对象驻留在哪个文件中?大多数博客都有脚本来查找驻留在文件组中的对象,但我想在该文件组中查找文件,以便我可以手动增长它们并查看是否可以修复它。

Cha*_*tox 1

重建不一定会将索引移动到新文件,它本质上会删除并重新创建索引,并且它将根据比例填充循环算法分布在文件组中的文件中如果其中一个文件需要成长,它可以做到这一点。

如果要执行 REORG,请手动增大空间不足的文件并执行 REORG。

要查看表中的哪些文件有数据,可以使用此查询(从/sf/ask/1409030101/获取的代码-文件):

select 
    OBJECT_NAME(p.object_id) as my_table_name, 
    u.type_desc,
    f.file_id,
    f.name,
    f.physical_name,
    f.size,
    f.max_size,
    f.growth,
    u.total_pages,
    u.used_pages,
    u.data_pages,
    p.partition_id,
    p.rows
from sys.allocation_units u 
    join sys.database_files f on u.data_space_id = f.data_space_id 
    join sys.partitions p on u.container_id = p.hobt_id
where 
    u.type in (1, 3)  and 
    OBJECT_NAME(p.object_id) = '<your table name>'
GO
Run Code Online (Sandbox Code Playgroud)