sql server 测试delete后数据空间情况
总结结论:
【1】如果是索引组织表,删除的数据空间是会被文件设置为可用状态,其他表都可以使用。
【2】如果是堆表,删除数据空间也会设置为可用状态,但是只能给被删除数据的表使用。
【3】truncate删除表数据、drop table 表,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。
1.测试delete后数据空间情况(聚集索引)
(1)文件大小
第1列为逻辑名称,第2列为文件大小,第3列为数据占用大小,第4列为数据占用/文件大小 的百分比。

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

(3)表结构

(4)删除test103表200W数据
delete top(2000000) from test103
(5)查看验证数据量
操作前:

操作后:

数据文件还涨了?事务日志文件怎么多了这么多,什么情况?
查看下增长规律:

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

初步结论。(聚集索引)
在第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] from temp1
where id <=2000000
)
insert into test103 from temp1
option(maxrecursion 0)
结果如下:

数据占用多了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] from temp1
where id <=2000000
)
select * into test1 from temp1
option(maxrecursion 0)
结果如下:

结论:通过聚集索引删除的数据,文件空间不会释放,但是会置于空闲状态。有其他数据使用的时候就会用次来填充。
3.Delete非聚集索引表,即堆表
直接删除test1即上面新建的200W数据行的堆表
delete test1
再查看大小:

嗯哼~!没有变化?
然后我们重复插入会该表100W数据看看。

插入完成之后来看看:

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

然后发现,增了??
难道,没有聚集索引的堆表,删除表数据后,数据只能给该表用?其他表不能占?
可能是这样,但我还要进一步确认,刚刚我们删除了test1表(堆表)的200W数据,后面又插入了100W数据,然而数据文件大小及实际数据占用内容并没有变化。
我们现在再插入99W试一试,200W删除-100W插入-99W插入,如果我们上面的推测是正确的,那么数据文件及文件实际占用也不会增加。

看看文件占用:

很明显,我们的理论是正确的。
结论:delete删除堆表数据,不会把数据空间置为空闲给交还给数据文件(注意,数据文件本身大小不会改变),然后所有表对象的增删改都不可以使用这部分空间,只有被删除数据的表才可以用这部分数据空间。
4.truncate 删除数据
truncate table test1(堆表)
结果:

很明显,truncate,是把数据空间占用给释放出来了,后续所有的表都可以使用该空闲空间;
结论:truncate删除表数据,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。
5.drop 删除表
再往test1表中,插入200W数据;

结果:

然后我们delete整个表看看
delete test1
结果:

依然没有变化;
我们直接drop table test1看看
结果:

执行成功后,发现,数据空间也释放出来了。
总结结论:
【1】如果是索引组织表,删除的数据空间是会被文件设置为可用状态,其他表都可以使用。
【2】如果是堆表,删除数据空间也会设置为可用状态,但是只能给被删除数据的表使用。
【3】truncate删除表数据、drop table 表,是会释放数据空间(即把占用部分数据空间置为空闲)给数据文件(注意,这里是给数据文件而不是操作系统,数据文件本身大小不会改变),然后所有表对象的增删改都可以使用这部分空间。
sql server 测试delete后数据空间情况的更多相关文章
- SQL Server安装完成后3个需要立即修改的配置选项(转载)
你用安装向导安装了全新的SQL Server,最后你点击了完成按钮.哇噢~~~现在我们可以把我们的服务器进入生产了!抱歉,那并不是真的,因为你的全新SQL Server默认配置是错误的. 是的,你没看 ...
- FileMaker Server连接SQL Server测试
用FM测试了一把扫二维码.效果还不错,简单的设置几下就可以上线,使用Iphone扫二维码进行盘点以及更新照片功能.接下来测试下下ODBC连接. FMS连接SQL Server测试 1. 在FMS服务器 ...
- Sql Server 2008卸载后再次安装一直报错
sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...
- SQL Server 安装好后 Always On群组配置
需要对SQL Server必要的端口打开Windows防火墙的入站规则,比如TCP- 1433端口等. 特别注意:由于AG默认需要用到TCP-5022端口,所以该端口务必保证在Windows防火墙中开 ...
- SQL server 数据连接池使用情况检测
1.依据HOST_NAME请求session_id 查询 select DB_NAME(database_id) dbname,login_name,t1.session_id,t1.request_ ...
- Python监控SQL Server数据库服务器磁盘使用情况
本篇博客总结一下Python采集SQL Server数据库服务器的磁盘使用信息,其实这里也是根据需求不断推进演化的一个历程,我们监控服务器的磁盘走了大概这样一个历程: 1:使用SQL Server作业 ...
- SQL SERVER 2000 迁移后SQL SERVER代理服务启动错误分析
公司有一个老系统,这个系统所用的数据库是SQL SERVER 2000,它所在的Dell服务器已经运行超过10年了,早已经过了保修服务期,最近几乎每周会出现一次故障,加之5月份另外一台服务器坏了两个硬 ...
- 阿里云RDS for SQL Server测试吐槽
最近测试了一下阿里云RDS for SQL Server,有些设计简直就是反人类,让人不得不吐槽一番. 1:控制台创建数据库时,数据库名不能包含大小字母. 如上截图所示,数据库名称不能包含大写字母,好 ...
- SQL server插入数据后,如何获取自增长字段的值?
insert into Tb_People(uname,era,amount) values( '兆周','老年','10000') select @@identity --当运行完插入语句后,执行s ...
随机推荐
- 因客户机IP与服务器IP不在同一网段导致无盘客户机开机卡tftp,提示:PXE-E11: ARP timeout
61的地址需要在上面的地址范围段之内 问题现象] 无盘客户机启动获取DHCP后卡在tftp界面提示:PXE-E11: ARP timeout,如下图: [原因说明] 客户机的IP地址与服务器IP地址不 ...
- SQL Server 数据库同步,订阅、发布、复制、跨服务器
随便说两句 折腾了一周,也算把数据库同步弄好了.首先局域网内搭建好,进行各种测试,弄的时候各种问题,弄好以后感觉还是挺简单的.本地测试好了,又在服务器进行测试,主要的难点就是跨网段同步,最后也解决了, ...
- 在堆栈中,push为入栈操作,pop为出栈操作
LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...
- Yii2发送邮箱总结
修改配置文件,普通版在(config/web.php).高级版默认配置在/common/config/main-local.php 'components' => [ 'mailer' => ...
- <mvc:annotation-driven />注解详解
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案.<mvc:annotation-dri ...
- w.5 Y k J.COm 9 如何做好总经理助理
总经理助理的工作职责:(指要做的事—做事的责任) 忠诚的总管家----总经理的代言人和执行官. 总经理助理一方面要为企业发展运筹帷幄,另一方面更要分担繁重的行政事务,所以他务必履行对该职业的使命感. ...
- IOS 开发之 -- 获取本机通讯录里面所有的联系人,并传到后台
项目中遇到一个需求,就是需要在入口的时候,获取通讯录的权限,并把所有的联系人,以接口参数的形式传到后台,通过网上查资料,历时3个小时,终于完成, 话不多,直接上代码: 1,导入系统库 #import ...
- IOS7开发~新UI学起(三)
1.UITextView: A ) IOS7新增加的 UITextViewDelegate 方法: - (BOOL)textView:(UITextView *)textView shoul ...
- css位置相关元素
1.border 是边框的意思,它可以设置粗细,多少像素,输入样式,solid是实线的意思,可以直接选择color边框的颜色. 也可以设置某个方向的边框,例如 设置一个div,让它的高和宽都为 ...
- Excel表导出
前言 分别介绍两种导出Exce表格的方法和读取Excel表格数据方法. 1.在MVC下的表格导出. 2.基于NPOI的表格导出. 3.读取Excel表格数据. 第一种方法:在MVC下的表格导出. 首 ...