我有一个巨大的表,它使用数据类型"image". 存储pdf文档。
最近,我们开始将文件卸载到blob存储,这就是我们希望缩小主数据文件的原因。
我所有缩小文件的尝试都没有成功。
通常情况下,它只占97%-98%,不会有任何进展。
即使被小块缩小,1024 mb也不起作用。
我还应该做些什么来解决这个问题?
这是我用来缩小的查询:
DECLARE @i int = 4501095 -- set original size
WHILE @i >= 4481000 Begin -- set final size
DBCC SHRINKFILE (N'DataFile' , @i)
--Shrink by 1024 MB at a time.
SET @i -= 1024
END
GO表占数据库的80%,有:
行数:6 472 619行;
尺寸: 2641.5 GB;
LOB数据:容量约2639.1 GB

发布于 2022-02-17 10:34:06
对这个表进行表格扫描需要多长时间,包括读取LOB数据?把它乘以346,161,152,你就会得到一个完整的收缩所需的时间,大致上是这样。然后根据它到达目标文件大小的点来减少一些。还有很长一段时间。
说你一次只缩小了1GB。这是131,072页。说这些页面中只有10万页是LOB页面。仍然有大量的桌子扫描!
想想心理医生是怎么做的。它将页面从文件的末尾移动到文件的开头。对于LOB页,Server需要调整该页的任何点,以反映新的页添加。LOB页面没有回指针,因此它需要对移动的每一页进行表扫描。那可是一大堆桌子扫描啊!
当然,当它达到目标尺寸时,收缩就会停止。
这里有一些细节,但上面并没有改变。LOB类型的数据可以是行(如果合适的话),但是既然您说您有2639 GB的LOB数据,那么我假设它们实际上是LOB页面。lob页面可以在行之间共享,与预约会设计相比,可以减少空间使用,也可以专门用于一行。LOB数据也有一个B树结构(允许“在中间搜索”),但是树中的节点不一定是页面,它们是页面上的数据。因此,不管细节如何,如果确实是移动的LOB页面,那么所有的页面都需要被读取,以确定哪些页面可能指向这个已移动的LOB页面。
在你的情况下,就住在自由的空间里。它不会伤害任何东西,也不会使您的备份变得更大(因为备份只备份已使用的区段)。
https://dba.stackexchange.com/questions/307590
复制相似问题