在我的一个生产数据库中,我有一个包含 3 个数据文件的文件组,这些文件位于 3 个不同的磁盘上。此文件组上有 50 多个表。
如何确定 3 个数据文件之间 50 个表中每一个的位置?我需要知道每个表的聚集索引驻留在哪个数据文件上。
例子 :
Table A : Datafile 1 : FG1
Table B : Datafile 2 : FG1
Table C : Datafile 1 : FG1
Table D : Datafile 3 : FG1
Run Code Online (Sandbox Code Playgroud) 我想知道如何计算文件组中每个文件消耗的数据分布,回到存储它的索引(HEAP、CLUSTERED、NONCLUSTERED)。我的目的是定义哪些 I/O 去磁盘上的哪个位置。
我data_space_id从 开始sys.indexes,显示已使用、已分配的页面;和data_space_id大小从sys.filegroups. 所以我到达了用于将数据存储到文件组内的文件的加权(按可用空间比率?)算法生效的地方。我可以加入sys.database_files使用data_space_id.
从sys.dm_allocation_units (通过object_Id和连接到索引index_Id)我得到partition_ID;加入sys.dm_partitions建议行数,使用和分配的页面,允许计算也显示每个分区的可用内容。无法分区到文件...?
我有一个查询,我根据文件组中每个文件的已使用页面的比率将 DATA 分配给 FILE,将该比率应用于存储在文件所属的文件组上的索引数据。
是否有更好的方法将表/索引数据向下钻取到文件级分配?(测量而不是计算?)
对于 indid = 0 或 indid = 1,dpages 是使用的数据页数。
对于 indid > 1,dpages 是使用的索引页数。
对于 indid = 0 或 indid = 1,used 是用于所有索引和表数据的总页数。
对于 indid > 1,used 是用于索引的页数。
对于 indid = 0 或 indid = 1,reserved 是为所有索引和表数据分配的页数。
对于 indid > 1,reserved 是为索引分配的页数。
查询语句:
Select T.Name …Run Code Online (Sandbox Code Playgroud) performance monitoring sql-server dmv disk-space performance-tuning
今天,我在我管理的一个 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 或增加任何已满文件的文件增长限制。
好的。所以解决方案是重建索引,使其移动到新文件。但是,如果我想继续将索引保存在同一个文件中,以便我的重组可以继续,该怎么办?那可能吗?另外,是否可以找出我的数据库对象驻留在哪个文件中?大多数博客都有脚本来查找驻留在文件组中的对象,但我想在该文件组中查找文件,以便我可以手动增长它们并查看是否可以修复它。