加入收藏 | 设为首页 | 会员中心 | 我要投稿 上海站长网 (https://www.021zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Sql server SQL Server移动";表“可用空间”;至;“

发布时间:2022-10-14 13:31:26 所属栏目:MsSql教程 来源:互联网
导读: Sql server SQL Server移动"表“可用空间”;至;“数据库可用空间”;
sql-server
Sql server SQL Server移动"表“可用空间”;至;“数据库可用空间”;,sql-server,Sql Ser

Sql server SQL Server移动";表“可用空间”;至;“数据库可用空间”;

sql-server

Sql server SQL Server移动";表“可用空间”;至;“数据库可用空间”;,sql-server,Sql Server,我有一个相当大的数据库(每天多达几百个分片表,mdf文件上的总容量为1.3TB)现在,由于我们希望尽最大努力阻止mdf进一步增长,我们将从现有表中删除尽可能多的不必要数据我们知道:从表中删除数据不会减少mdf文件大小缩小文件/数据库是毫无疑问的从旧表(如表20161231)中删除不会为新表(如表20170927)释放数据库空间,除非重建旧表所以我们理解表重建是必要的,修改索引似乎没有帮助,根据“exec sp_spaceused”的结果,空间仍然没有释放因此,我们现在正在做以下工作

我有一个相当大的数据库(每天多达几百个分片表,mdf文件上的总容量为1.3TB)

现在,由于我们希望尽最大努力阻止mdf进一步增长,我们将从现有表中删除尽可能多的不必要数据

我们知道:

从表中删除数据不会减少mdf文件大小缩小文件/数据库是毫无疑问的从旧表(如表20161231)中删除不会为新表(如表20170927)释放数据库空间mssql数据库空间,除非重建旧表所以我们理解表重建是必要的,修改索引似乎没有帮助,根据“exec sp_spaceused”的结果,空间仍然没有释放

因此,我们现在正在做以下工作:

delete from  where data = 'unnecessary';
select * into table_20161231_compact from table_20161231
drop table table_201table_2016123161231

从表_20161231中删除,其中数据=‘不必要’从表\u 20161231中选择*进入表\u 20161231\u压缩升降台表_20161231再次执行“exec sp_spaceused”似乎显示了一个积极的结果,因为它为新表提供了更多的“未分配空间”

有人知道一种释放已删除数据空间的单行方法吗?

当您从表中删除数据时,SQL Server会保留该空间以供重用,因为它假定该空间最终会被填满。如果你想要它回来,不幸的是逃避是唯一的方法。它可能充满危险,但作为一个一次性的,您知道数据将不会恢复到那个大小,然后您会处理索引碎片,然后它应该是好的

这样做可能是最安全的方法,您可以编写脚本并使用

sp_rename

更改表名

迈克·沃尔什写了一篇很不错的博客,讲述了当你从堆中删除时,会发生什么。如果只是删除行,堆不会释放空间,可能的解决方法是创建聚集索引或使用

tablock

删除:

从堆中删除行从堆中删除行时,数据库引擎可能会使用行或页锁定进行操作。作为一个结果,通过删除操作变为空的页面仍保持分配状态到堆里去。未释放空页时,关联的空间不能被数据库中的其他对象重用。删除在堆和释放页中的行中,使用以下方法之一

以防万一,如果您不知道如何使用

tablock

,以下是一个示例:

delete dbo.myTbl with(tablock)
where...

附言

因此,我们现在正在做以下工作:

delete from  where data = 'unnecessary';
select * into table_20161231_compact from table_20161231
drop table table_201table_2016123161231

有人知道一种释放已删除数据空间的单行方法吗

是的,可以从SQL Server 2008开始,在1个命令中完成:

alter table table_20161231 rebuild

>>>从旧表(如表20161231)中删除不会为新表腾出数据库空间table@sepupic,你问的似乎超出了我的知识范围,我只是从非常简单的表中进行非常简单的删除,我如何找到你需要知道的内容?很简单。在SSMS中为表编写脚本,并查看表上是否有聚集索引。如果一个表没有聚集索引,它就是一个堆。请检查它,这很重要,因为如果不是在特定条件下,堆不会释放可用空间conditions@sepupic我尝试编写CREATETABLE语句的脚本,但是它没有聚集索引。所以它就像我想的那样是一个堆。我会用链接发布答案,并解释如何在一分钟内避免这种情况嗯,我们希望避免缩小,因为这是一个实时生产数据库,每秒钟都有许多事务在进行,我们希望尽量减少做一些占用大量资源的事的需要,例如HD IO..@dbajtr OP的问题不在于向操作系统释放空间,他从堆中删除,而它们不向数据库释放空间,删除后空闲页面仍然分配给堆。

(编辑:上海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!