重建索引,DB 现在大小是原来的 10 倍

Jef*_*ane 13 sql-server-2008 sql-server sql-server-2008-r2

我有一个大约 15 个演出的 SQL Server 数据库(2008 R2 SP1)。结果发现维护已经有一段时间没有运行了,所以我创建了一个维护计划来重建所有索引,它们非常分散。

工作完成,碎片消失了,但现在数据库超过 120 个演出!我知道它会使用额外的空间来进行所有重建,但是现在工作已经完成,我认为所有空间都将是可用空间,但可用空间仅显示为 3 个演出,因此正在使用 117 个演出即使索引重建作业已完成。

我很困惑,可以使用一些指导,我让数据库恢复到合理的大小,我们没有磁盘空间。

提前致谢!

这是发布的两个查询的结果:

log_reuse_wait_desc 什么都没有

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688
Run Code Online (Sandbox Code Playgroud)

第三个文件是 .ndf 文件,该文件在未使用空间中仅显示 3688,但 111289 用于大约 15 演出数据。

Jef*_*ane 15

与此同时,我刚刚想通了这一点,全脑打嗝。我已经指出我认为在重建作业中填充因子为 90,但它的措辞是“将可用空间百分比更改为”,因此通过在其中使用 90 的值,我实际上使用了 10 的填充因子!!卫生部。难怪它增长了 10 倍。我将使用正确的填充因子重建然后收缩。感谢大家的投入。


Mar*_* N. 0

您应该使用重建选项SORT_IN_TEMPDB=ON

在您的情况下,相关表所在的实际数据文件已用于对索引进行排序。120GB 空间中的大部分尚未使用,将在需要时填充页面数据。

您可以使用此查询查看已用/可用空间状态(取自此处):

use [YourDatabaseNameHere]
go

select
    name,
    cast((size/128.0) as int) as TotalSpaceInMB,
    cast((cast(fileproperty(name, 'SpaceUsed') as int)/128.0) as int) as UsedSpaceInMB,
    cast((size/128.0 - cast(fileproperty(name, 'SpaceUsed') AS int)/128.0) as int) as FreeSpaceInMB
from
    sys.database_files
Run Code Online (Sandbox Code Playgroud)

对于收缩特定数据库文件(数据或日志),您可以在此处查看一些信息。在此之前警告,对于 100+ Gb 的数据库来说,释放未使用的空间需要相当长的时间(也取决于存储速度),所以就让它运行吧。