使用收缩 SQL 服务器的最佳做法是什么?

What is best practice to use shrink SQL Server?

我读了很多书,不推荐收缩数据库,因为它会导致碎片化,从而导致性能下降。

参考:

https://www.brentozar.com/archive/2017/12/whats-bad-shrinking-databases-dbcc-shrinkdatabase/

https://straightpathsql.com/archives/2009/01/dont-touch-that-shrink-button/

但是,好像是数据文件的情况,如果日志满了,收缩日志应该没有问题吧?

如果数据文件很大需要很多 space,我确实需要更多 space 来插入和更新一些新数据,缩小显然会减少驱动器上文件的大小,我假设我可以使用免费 space 来插入新数据。但如果不建议收缩,我该如何解决?什么时候使用 shrink

最好

if the data file is huge that takes a lot of space, I do need more space to insert and update some new data, shrinking apparently reduce the size of the file on the drive, which I assumed that I could use the free space to insert new data.

如果你的数据文件占用了很多space并不意味着这个space是空的

您应该使用sp_spaceused来确定数据文件中是否有未使用的space。

如果有未使用的space,则已经使用"to insert and update some new data",如果没有shrink 什么都不会改变:shrink 不会删除您的数据,它所做的只是将数据移动到文件的开头以使 space 最后还给 OS.

当您有一个 2Tb 的数据文件并且删除了 1Tb 的数据并且您不打算在未来 10 年内插入另一个 Tb 的数据时,收缩数据文件会很有用。

您可以将 data file 想象成一个 1m x 1m x 1m 的盒子。如果你只有一半的盒子装满了玩具,即使你不用shrink你也可以把其他的玩具放进这个盒子里(makeinsert/update)。 shrink 所做的是,它将所有玩具聚集在一个角落,然后切割您的盒子以使其成为 50cm x 50cm x 50cm。这样你的房间 (OS) 现在有更多的空闲空间 space 因为你的玩具箱只占用了缩小前 space 的一半。

...如果您的盒子已经满了,即使您尝试 shrink.

也无法添加更多玩具

if the log is full, shrinking log should not be a problem right?

Shrinkig log是另一个进程,log file里面什么都不能动,从这个意义上说当然shrink不会像data file那样造成太大的伤害:它不需要服务器资源,它不会导致任何碎片等。 但成功与否取决于你"log is full".

的原因

如果您的日志因 full model 而满,缩小日志文件不会改变任何内容:保留日志是为了让您有可能 log backup chain(或使 mirroring,或 log shipping,等等)。

如果您的数据库 recovery modelsimple,并且长时间打开的 transaction 出现了一些问题,或者有一个巨大的 data loading(也许有完整的日志记录,例如没有 tablockinsert into)并且你的 log file 变得比 data file 大,你发现并解决了问题,你不需要这么大log file,是的,你可以把它缩小到一个合理的大小,而且没有害处。