首先看一个例子:
--创建测试表
CREATE TABLE testfreespace
( column1 INT
,column2 CHAR(20)
,column3 VARCHAR(8000))
--插入数据
DECLARE @count INT;
SET @count = 0;
WHILE @count < 3000
BEGIN
SELECT
@count = @count + 1;
INSERT into testfreespaceVALUES( @count,'test row # '+CAST(@countASVARCHAR(10)),REPLICATE('TestData',
3000)) ;
END
3. --查看使用空间使用情况
SELECT
alloc_unit_type_desc,
page_count,
avg_page_space_used_in_percent,
record_count
FROM
sys.dm_db_index_physical_stats(DB_ID('FNDBLogtest'),OBJECT_ID(N'Testfreespace'),NULL,NULL,'Detailed')
alloc_unit_type_desc page_countavg_page_space_used_in_percent record_count
-------------------------------------------------------------------------------------------------------------- --------------------
IN_ROW_DATA 3000
99.27106498640973000
(1 row(s) affected)
4. --删除整张表数据
delete from testfreespace
5. 运行脚本3得到下面的
alloc_unit_type_desc page_count avg_page_space_used_in_percentrecord_count
-------------------------------------------------------------------------------- ------------------------------ --------------------
IN_ROW_DATA 3000 0 0
可以看到虽然整张表的数据都被删除了但是表空间数据没有被释放。原因是SQL Server HEAP表空间释放需要两个条件:
·A deletion onthis table occurs.
·A table-levellock is being held.
释放空页时,数据库中的其他对象将无法重用关联的空间。
解决这个问题可以用下面的方法:
·在 DELETE语句中指定 TABLOCK提示。使用
TABLOCK 提示会导致删除操作获取表的共享锁,而不是行锁或页锁。这将允许释放页。
·如果要从表中删除所有行,请使用 TRUNCATE TABLE。
·删除行之前,请对堆创建聚集索引。删除行之后,可以删除聚集索引。与先前的方法相比,此方法非常耗时,并且使用更多的临时资源。(因为建立聚集索引所有非聚集索引都要相应更新(RID到聚集索引KEY),删除聚集索引后所有非聚集索引又要一次更新,将Primary Key更改为HEAP表的RID)
下面我用DELETE WITH (TABLOCK)删除表然后我们看一下结果:
--删除整张表数据
delete fromtestfreespacewith(TABLOCK)
alloc_unit_type_desc page_count avg_page_space_used_in_percentrecord_count
-------------------------------------------------------------------------------- ------------------------------ --------------------
IN_ROW_DATA 0 0 0
另外建议表建立主键。(上面只针对HEAP表的情况)。
分享到:
相关推荐
详细介绍如何正常删除Oracle 数据库表空间数据文件,OFFLINE和OFFLINE DROP的区别,OS级别删除了数据文件后的恢复,删除数据库表空间数据文件演示示例
oracle定时删除表空间的数据并释放表空间
oracle表数据已经删除,但是表空间不能释放的情况;支持查询单表占用空间大小,释放掉占用的无效空间;支持批量生成释放脚本,释放掉空表占用的表空间;
删除表中重复数据 删除表中重复数据 删除表中重复数据
删除表中重复数据sql语句 绝对经典和详细 太好了
删除表中产生的重复数据,并且不会损害和修改原表数据.
用一条SqlServer语句即可删除当前数据库中所有表的数据,表的结构保持不变。
有些表较大,最大的表可以达到1T的数据量,另外还有四五张800G左右的数据。所有的表数据量大概有100亿条数据,其中需要删除的估计大概有80亿条数据,并且此系统为核心系统不允许停机维护数据,所以删除数据十分麻烦...
定期删除数据表里数据方法汇总 包含作业 存储过程等
可以在数据库浏览工具中,执行批量删除数据表,节省时间和操作复杂度。
Oracle 定时删除数据 并释放空间 ,创建存储过程并使用job完成。
常用的sql语句。新建表、删除表、插入数据、删除数据、更新数据、新增字段、删除字段、修改字段、新建约束、删除约束,等等常用语句
sap批量删除、添加、修改透明表数据
主要用于创建表空间,创建用户,指定默认表空间临时表空间,删除表空间等
对于运行很长时间的数据库来说,往往会出现表占用存储空间过大的问题,可是将许多没用的表删除之后,表文件的大小并没有改变,想解决这个问题,就需要了解 InnoDB 如何回收表空间的。 对于一张表来说,占用空间重要...
1、使用存储过程的方法 2、使用游标的方法 3、进行对表数据的维护 4、执行表正确的CBO操作
回滚段是数据库的一部分,它记录数据库变更的信息。使用这些信息实现数据库的读一致性及其恢复。若回滚段出现故障,则数据库不能正常启动,导致数据库瘫痪,...本文将为大家介绍Oracle回滚表空间数据文件误删除处理。
如果在创建数据库的时候设置innodb_file_per_table=1,这样InnoDB会对每个表创建一个数据文件,然后只需要运行OPTIMIZE TABLE 命令就可以释放所有已经删除的磁盘空间。 运行OPTIMIZE TABLE 表名后,虽然最后会报...
在linux下通过shell指令实现按照用户指定的日期删除mysql中的表数据,不想收积分的,但是它最低收一分