数据库达到了10 the的限制。我在某一年龄批准了很多订单。此清除空间是否可用于同一数据库中的其他表?我不需要减少数据库文件本身,我不介意分配10 to,因为我宁愿没有其他文件的空间,也不愿占用数据库的空间。
是否需要在表中释放用于其他表的空空间?
发布于 2021-08-22 09:57:04
Server将数据存储在8kb页上,然后将数据安排为表示表的数据结构。在这种情况下,我发现在笔记本中把它们当作文字页是有帮助的。笔记本是你的数据库数据文件(S),它有很多页。在笔记本里面,它会将某些页面分配给表格和索引,但也有一堆空闲空间。
您可以运行一个查询来查看数据库中有多少空闲空间。我有一个开源的DBA数据库,它有一个可以用于检查_FileSize的存储过程,它将显示已使用的和空闲的空间。
您还可以通过使用内置存储过程EXEC sp_spaceused 'dbo.MyTableName'在表级别看到分配的总空间和使用的空间。
行数据本身存储为堆或聚集索引顺序。如果它是一个堆,它会随意地在笔记本上涂鸦,只要有空闲的空间。如果表具有聚集索引,则按群集键的顺序逻辑地维护行数据。既然您提到您删除了订单,我猜您可能有一个类似于OrderID或OrderDate之类的聚集索引,其中任何一个都将数据大致按时间顺序排列。
您可能还为重要数据(如AccountID和OrderStatus )设置了非聚集索引。这些也是按索引键顺序存储的,每个索引都在同一本笔记本中自己的一组页面上。
你说过你删除了数据..。您没有提到多少,但就我的例子而言,假设您删除了1/3的订单。
如果您删除了一组最老的数据,这就像在索引开始时删除了一组连续的页面,并从这些页面中删除了每一行。这看上去不错。在笔记本的类比中,有一堆连续的页面是空的,你有1/3的页面可以重用。对吗?
在AccountID的索引中,有一堆指向已删除订单的索引指针,您已经从页面中间删除了这些指示。这些页面现在平均为空1/3。
在OrderStatus索引上,您还删除了对已删除行的大量引用。但是,因为它们都是旧的、已完成的订单,它们不一定是整洁的连续清理,它们将是随机的,与状态“竞争”。此索引可能包含完全空页和部分空页的组合。但是,空页可能位于索引的“中间”。中间的空页将不能立即被重用,因为它们被卡在旧页的中间。
那得看情况。如果您在分配给表/索引的页面上有空闲空间,并且空闲空间位于正确的位置,SQL Server可以根据需要将数据添加回该页面。
但是,如果您真的希望尽可能多地回收空间,则需要重新构建表上的索引。现在,您不需要频繁地(甚至定期)进行索引重新构建。但是在您的情况下,您希望从一个重要的删除操作中回收空间,因此将其作为一个一次性操作是有意义的。
ALTER INDEX... REBUILD是速成版中的一个离线操作,所以请记住,它将在重建过程中锁定您的表。
https://dba.stackexchange.com/questions/298382
复制相似问题