当前位置: 网站首页 > 技术专题 > 数据库专题 >

数据表空间的重用

时间:2010-04-23 14:58  来源:未知   点 击:
导读』:如果删除掉一些数据行,我是否需要压缩SQL Server数据库? 以便于这些空间可以被重新使用.这是一个很好的问题,切经常被问到,其中涉及到SQL Server数据库对删除的管理以及压缩机制. ..
关键字:数据表空间重用

1.理解SQL Server怎样自动的重新利用数据表的空间,下面以实例来做简要的说明.

  1.1 建立临时测试数据

  创建一个测试table: Test,填空1000行数据.

--create a test table
CREATE TABLE dbo.Test
(
col1 INT
,col2 CHAR(25)
,col3 VARCHAR(4000)
) ;
--create some test data
DECLARE @cnt INT ;
SET @cnt = 0 ;
WHILE @cnt < 1000
BEGIN
SELECT
@cnt = @cnt + 1 ;
INSERT
dbo.Test ( col1,col2,col3 )
VALUES (
@cnt
,'test row # ' + CAST(@cnt AS VARCHAR(10)) + 'A'
,REPLICATE('ABCD', ROUND(RAND() * @cnt, 0))
) ;
END

  首先介绍一个DMV:sys.dm_db_index_physical_stats

数据表空间的重用(Reusing space in a table)

  查看原图(大图)

  有几个重要的栏位: alloc_unit_type_desc:有效值为:IN_ROW_DATA,LOB_DATA,ROW_OVERFLOW_DATA page_count:储存数据行的数据页数 avg_page_space_used_in_percent:数据页使用的平均百分比 record_count:总的记录数根据这个DMV看看测试表Test的查询结果:

--DMV SQL
select alloc_unit_type_desc,page_count,avg_page_space_used_in_percent,record_count 
from sys.dm_db_index_physical_stats(db_id(),object_id('Test'),NULL,NULL,'Detailed')
结果如下:

 可以看到储存1000条数据依然用到152页,但是每个页的空间使用率从43.2%提高到了65.%,说明SQL Server重用表中多余的空间,而没有增加新的数据页.  在此请注意用到的测试表是用堆存储结构(没有建立索引),表中数据行没有预先特定的排序.在索引表中也同样适用,SQL Server会很好的重用表中空余的空间(holes). 1.4 CLean Up

  --clean up

  DROP TABLE dbo.Test ;

  2.SQL Server不自动回收空间时

  在某种情况下,SQL Server并不会自动的回收已经不用的空间.如果一个表的定义被改变(比如说DROP掉一个或者几个栏位),已经消耗掉的空间并不会被SQL Server立即重用. 下面举例说明: 2.1 建立测试数据

CREATE TABLE dbo.Test2
(
col1 INT
,col2 CHAR(25)
,col3 VARCHAR(4000)
) ;
--create some test data
DECLARE @cnt INT ;
SET @cnt = 0 ;
WHILE @cnt < 1000
BEGIN
SET @cnt = @cnt + 1 ;
INSERT INTO dbo.Test2 ( col1,col2,col3) VALUES (
@cnt,'test row # ' + CAST(@cnt AS VARCHAR(10)),REPLICATE('A', 4000)) ;
END

数据表空间的重用(Reusing space in a table)

  查看原图(大图)

  同上一个例子一样运行SQL DMV的查询,针对table:Test2

--SQL DMV
select alloc_unit_type_desc,page_count,avg_page_space_used_in_percent,record_count 
from sys.dm_db_index_physical_stats(db_id(),object_id('Test2'),NULL,NULL,'Detailed')
 可以看到:

数据表空间的重用(Reusing space in a table)

  1000行数据占用500个数据页,每个页的空间使用率为99.8% 2.2 DROP掉一个栏位(比如col3)

  ALTER TABLE dbo.Test2 DROP COLUMN col3 ;

  运行SQL DMV之后看到的是:

数据表空间的重用(Reusing space in a table)

  和DROP掉一个栏位之前一样的是:1000行数据占用500个数据页,每个页的空间使用率为99.8%.SQL Server并没有回收不用的空间,没有从数据页从移除掉那一栏的数据. SQL Server的做法只是更新系统表中的元数据,在查询时这一列不会作为结果集显示出来,数据所占的空间也不会被释放掉. 2.3 添加数据

--insert additional rows
DECLARE @cnt INT ;
SET @cnt = 0 ;
WHILE @cnt < 500
BEGIN
SET @cnt = @cnt + 1 ;
INSERT INTO dbo.Test2 ( col1,col2 )VALUES (
@cnt,'test row # ' + CAST(@cnt AS VARCHAR(10))) ;
END

  再次运行SQL DMV查询:

数据表空间的重用(Reusing space in a table)

  1500行的数据占用503个数据页,每个页的空间使用率为99.7%,可以看到新增三个数据页.如果空间可以重用的话,应该会有足够多的空间存储新增的500行数据,并不需要新增数据页.

很强大!
(0)
0%
烂透了!
(0)
0%
编辑:danny

分享与收藏:
您可能感兴趣的文章

数据恢复

热门技术文章

硬盘常见问题