总结结论:

  【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后数据空间情况的更多相关文章

  1. SQL Server安装完成后3个需要立即修改的配置选项(转载)

    你用安装向导安装了全新的SQL Server,最后你点击了完成按钮.哇噢~~~现在我们可以把我们的服务器进入生产了!抱歉,那并不是真的,因为你的全新SQL Server默认配置是错误的. 是的,你没看 ...

  2. FileMaker Server连接SQL Server测试

    用FM测试了一把扫二维码.效果还不错,简单的设置几下就可以上线,使用Iphone扫二维码进行盘点以及更新照片功能.接下来测试下下ODBC连接. FMS连接SQL Server测试 1. 在FMS服务器 ...

  3. Sql Server 2008卸载后再次安装一直报错

    sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...

  4. SQL Server 安装好后 Always On群组配置

    需要对SQL Server必要的端口打开Windows防火墙的入站规则,比如TCP- 1433端口等. 特别注意:由于AG默认需要用到TCP-5022端口,所以该端口务必保证在Windows防火墙中开 ...

  5. SQL server 数据连接池使用情况检测

    1.依据HOST_NAME请求session_id 查询 select DB_NAME(database_id) dbname,login_name,t1.session_id,t1.request_ ...

  6. Python监控SQL Server数据库服务器磁盘使用情况

    本篇博客总结一下Python采集SQL Server数据库服务器的磁盘使用信息,其实这里也是根据需求不断推进演化的一个历程,我们监控服务器的磁盘走了大概这样一个历程: 1:使用SQL Server作业 ...

  7. SQL SERVER 2000 迁移后SQL SERVER代理服务启动错误分析

    公司有一个老系统,这个系统所用的数据库是SQL SERVER 2000,它所在的Dell服务器已经运行超过10年了,早已经过了保修服务期,最近几乎每周会出现一次故障,加之5月份另外一台服务器坏了两个硬 ...

  8. 阿里云RDS for SQL Server测试吐槽

    最近测试了一下阿里云RDS for SQL Server,有些设计简直就是反人类,让人不得不吐槽一番. 1:控制台创建数据库时,数据库名不能包含大小字母. 如上截图所示,数据库名称不能包含大写字母,好 ...

  9. SQL server插入数据后,如何获取自增长字段的值?

    insert into Tb_People(uname,era,amount) values( '兆周','老年','10000') select @@identity --当运行完插入语句后,执行s ...

随机推荐

  1. PHP——连接数据库初

    <?php //1.生成连接 造连接对象 //$db=new mysqli($dbhost(服务器),$username,$userpass,$dbdatabase); $db = new my ...

  2. notification 报错the method build() is undefined for the type Notificatin.Builder

    notification 报错the method build() is undefined for the type Notificatin.Builder 这事api版本号太低导致的 Notifi ...

  3. go json解析

    JSON转换库为 encoding/json 把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下 func Marshal(v interface{}) ([]byte ...

  4. jquery库实现iframe自适应内容高度和宽度

    javascript原生和jquery库实现iframe自适应内容高度和宽度---推荐使用jQuery的代码! ‍<iframe src="index.php" id=&qu ...

  5. OAuth2.0 介绍

    一.基本协议流程: (1) Client请求RO(Resource Owner)的授权:请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息.(2) RO批准授权:并将“授权证据”发送 ...

  6. 【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1699 我是用树状数组做的..rmq的st的话我就不敲了.. #include <cstdio& ...

  7. C# 重命名文件

    在vb下,有一个方法可以对文件进行重命名,所以,我们只要引用到这种方法进行应用即可. 1.添加引用Microsoft.VisualBasic 2.添加命名空间using Microsoft.Visua ...

  8. hdu 3667(拆边+最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...

  9. iOS开发之--png图片编译时报错 (Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with exit code 1 )

    编译或者运行APP的时候,老是报这个错误:Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with ...

  10. ORA-00845 MEMORY_TARGET not supported on this system解决办法

    ORA-00845: MEMORY_TARGET not supported on this system报错解决 Oracle 11g数据库修改pfile参数后启动数据库报错ora-00845 SQ ...