sql server 测试delete后数据空间情况

摘要:
5.拖放以删除表,并将200W数据插入test1表中;结果:然后让我们删除整个表并查看deletetest1结果:仍然不变;让我们直接放下tabletest1来看看结果:执行成功后,我们发现数据空间也被释放了。

总结结论:

【1】如果是索引组织表,删除的数据空间是会被文件设置为可用状态,其他表都可以使用。

【2】如果是堆表,删除数据空间也会设置为可用状态,但是只能给被删除数据的表使用。

【3】truncate删除表数据、drop table 表,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。

1.测试delete后数据空间情况(聚集索引)

(1)文件大小  

第1列为逻辑名称,第2列为文件大小,第3列为数据占用大小,第4列为数据占用/文件大小 的百分比。

sql server 测试delete后数据空间情况第1张

(2)数据表情况(本测试用test103表进行操作,占了240M)

sql server 测试delete后数据空间情况第2张

(3)表结构

sql server 测试delete后数据空间情况第3张

(4)删除test103表200W数据

delete top(2000000) from test103

(5)查看验证数据量

操作前:

sql server 测试delete后数据空间情况第4张

操作后:

sql server 测试delete后数据空间情况第5张

数据文件还涨了?事务日志文件怎么多了这么多,什么情况?

查看下增长规律:

sql server 测试delete后数据空间情况第6张

(6)再次删除200W条,查看数据文件

sql server 测试delete后数据空间情况第7张

初步结论。(聚集索引)

在第1次删除的时候(删除200w)

数据文件:文件大小从260M-》320M,实际占用数据大小从260-》220M。 数据文件总大小加了60M,数据占用大小减少了40M左右。

日志文件:文件大小从380M-》1200M,实际占用大小从370M-》800M。。数据文件总大小加了800多M,实际数据占用增加了430M左右。

在第2次删除的时候(删除200w)

数据文件:文件大小从320M-》320M,实际占用数据大小从220M-》167M。 数据文件总大小加了0M,数据占用大小减少了53M。

日志文件:文件大小从1200M-》1588M,实际占用大小从800M-》1223M。。数据文件总大小加了400M左右,实际数据占用增加了430M左右。

2.插入操作

重新插入200W行数据到原表,

;with temp1 as(
select 1 as id,'a' as name,'b' as home,123456789 as phone,'gg' as 'desc'
union all
select id+1,'a' as name, home,phone+1,[desc] fromtemp1
where id <=2000000
)
insert into test103 fromtemp1
option(maxrecursion 0)

结果如下:

sql server 测试delete后数据空间情况第8张

数据占用多了229-167 约等于50M

插入一个新表200W行(没有聚集索引,即堆表)

;with temp1 as(
select 1 as id,'a' as name,'b' as home,123456789 as phone,'gg' as 'desc'
union all
select id+1,'a' as name, home,phone+1,[desc] fromtemp1
where id <=2000000
)
select * into test1 fromtemp1
option(maxrecursion 0)

结果如下:

sql server 测试delete后数据空间情况第9张

结论:通过聚集索引删除的数据,文件空间不会释放,但是会置于空闲状态。有其他数据使用的时候就会用次来填充。

3.Delete非聚集索引表,即堆表

直接删除test1即上面新建的200W数据行的堆表

delete test1

再查看大小:

sql server 测试delete后数据空间情况第10张

嗯哼~!没有变化?

然后我们重复插入会该表100W数据看看。

sql server 测试delete后数据空间情况第11张

插入完成之后来看看:

sql server 测试delete后数据空间情况第12张

空间也没有变。

那么我再插入50W条到test3表(一个新表),看看数据文件会不会增加。(为什么50W呢?我不想超出200W的上线,刚已经插入了100W了)

sql server 测试delete后数据空间情况第13张

然后发现,增了??

难道,没有聚集索引的堆表,删除表数据后,数据只能给该表用?其他表不能占?

可能是这样,但我还要进一步确认,刚刚我们删除了test1表(堆表)的200W数据,后面又插入了100W数据,然而数据文件大小及实际数据占用内容并没有变化。

我们现在再插入99W试一试,200W删除-100W插入-99W插入,如果我们上面的推测是正确的,那么数据文件及文件实际占用也不会增加。

sql server 测试delete后数据空间情况第14张

看看文件占用:

sql server 测试delete后数据空间情况第15张

很明显,我们的理论是正确的。

结论:delete删除堆表数据,不会把数据空间置为空闲给交还给数据文件(注意,数据文件本身大小不会改变),然后所有表对象的增删改都不可以使用这部分空间,只有被删除数据的表才可以用这部分数据空间。

4.truncate 删除数据

truncate table test1(堆表)

结果:

sql server 测试delete后数据空间情况第16张

很明显,truncate,是把数据空间占用给释放出来了,后续所有的表都可以使用该空闲空间;

结论:truncate删除表数据,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。

5.drop 删除表

再往test1表中,插入200W数据;

sql server 测试delete后数据空间情况第17张

结果:

sql server 测试delete后数据空间情况第18张

然后我们delete整个表看看

delete test1

结果:

sql server 测试delete后数据空间情况第19张

依然没有变化;

我们直接drop table test1看看

结果:

sql server 测试delete后数据空间情况第20张

执行成功后,发现,数据空间也释放出来了。

总结结论:

【1】如果是索引组织表,删除的数据空间是会被文件设置为可用状态,其他表都可以使用。

【2】如果是堆表,删除数据空间也会设置为可用状态,但是只能给被删除数据的表使用。

【3】truncate删除表数据、drop table 表,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。

免责声明:文章转载自《sql server 测试delete后数据空间情况》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇parted分区GPT格式windows server常用命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

drf 准备知识(Web应用模式、 api接口、RESTful API规范和序列化)

程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端。 什么是静态页面,什么是动态页面? 动态页面(需要查数据库的)是前端需要发请求给后端,后端朝数据库搜索并返回数据,前端再dom渲染数据 静态页面就是死的,页面内容不会发生变化,固定不变的 1. Web应用模式在开发Web应用中,有两种应用模式: 1.前后端不分离[客户端看到的内容和所有界面...

【转】Sonar扫描bug修复

原文:https://blog.csdn.net/qq_27790011/article/details/89309694   一、BUG 1.Not enough arguments. 上面的这种bug在项目中很常见,参数都用new Object[]{}封装起来。特别是从class文件反编译回来成的java文件格式也是这样的。但是如果要消除...

iOS 三方库fmdb 的使用

使用fmdb 做本地数据的存储非常方便, 1. github 上搜索fmdb 下载压缩包 导入到工程中 (如果你的mac 有cocoapod 也可以直接通过cocoapod 添加) 2. 以下代码是通过fmdb 多数据库的各种操作,其中有几点需要注意:(1). 程序中 Ceasar 是表名 (2). 修改数据库数据 提前准备字符串时 值 要用单引号括起来...

HBase中的时间维度

HBase是一个类Bigtable系统,按照Google的论文对 Bigtable的定义是“一种稀疏的,分布式的,持久的多为维度的有序Map。这个Map由row key,column key和timestamp做为索引,Map中的值是连续的byte数组”。HBase的多维度,包括table和column family等。 不是所有维度都是等同的,不同的维度...

Mysql --数据的增删改

插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 一、 在mysql管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 1.使用insert实现数据的插入 2.update实现数据的更新 3.使用delete实现数据的删除 4.使用select查询数据以及。 二、插入数据 insert 1. 插入完整数据(顺...

Doris导数 踏雪扬尘

目录 概述 导入方式 批量删除 Broker Load Routine Load Stream load 概述 Doris现在支持Broker load/routine load/stream load/mini batch load等多种导入方式。spark load主要用于解决初次迁移,大量数据迁移doris的场景,用于提升数据导入的速度。 导...