Share via


关于SQL 2008数据库压缩后收缩(database shrink)的测试实验和性能比较

如果您正在面临压缩数据库的问题,那么这篇文章很可能帮助启发您。

数据库收缩性能问题可能会涉及一个关于栈内页面压缩的漏洞https://support.microsoft.com/kb/963658这篇文章讨论中数据库收缩之后可能页面压缩(page compression)会被移除,也许后续开发会完善这功能,让收缩之后页面压缩重建。

总而言之,聚集索引是在压缩和收缩方面最好用的工具

测试实验环境参数

数据库Database:

database_name database_size unallocated space

------------------ ------------------ ------------------

test1 26619.56 MB 15833.65 MB

reserved data index_size unused

------------------ ------------------ ------------------ ------------------

10418984 KB 6820040 KB 3571560 KB 27384 KB

 

包含一个表格: table1

Sp_spaceused table1

name rows reserved data index_size unused

-------------------------------------------------------------------------------------------------------------------------------- ----------- ------------------ ------------------ ------------------ ------------------

table1 62113305 10417560 KB 6819464 KB 3570824 KB 27272 KB

 

Sp_helpindex  table1:

i_table_1             clustered located on PRIMARY   SalesOrderDetailID

i_table1_1           nonclustered located on PRIMARY           RowNumber, SalesOrderID, CarrierTrackingNumber, rowguid

 

SELECT PageCompressedAgain = page_count FROM sys.dm_db_index_physical_stats (

DB_ID (),

OBJECT_ID ('table1'),

NULL, NULL, 'SAMPLED');

852433

439130

 

delete from table1 where RowNumber%47 =1

(1321559 row(s) affected)

测试脚本:

print getdate()

dbcc shrinkfile(1)

print getdate()

测试1:

聚集索引条件下,行压缩 cluster index + row compression

Compression –log 4.85 GB (5,218,172,928 bytes)

SELECT PageCompressedAgain = page_count FROM sys.dm_db_index_physical_stats (

DB_ID (),

OBJECT_ID ('table1'),

NULL, NULL, 'SAMPLED');

561638

439130

Sp_spaceused table1

table1 60791746 8046304 KB 4493104 KB 3552312 KB 888 KB

shrink log 1.40 GB (1,511,325,696 bytes)

收缩之后:

PageCompressedAgain

--------------------

561638

439130

table1 60791746 8046528 KB 4493104 KB 3552288 KB 1136 KB

database_name database_size unallocated space

------------------- ------------------ ------------------

test1 9300.81 MB 0.19 MB

reserved data index_size unused

------------------ ------------------ ------------------ ------------------

8047936 KB 4493688 KB 3552960 KB 1288 KB

Mar 26 2010 3:46PM

DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages

------ ----------- ----------- ----------- ----------- --------------

12 1 1006016 256 1006000 1006000

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Mar 26 2010 3:52PM

耗时6分钟.

测试2:

在聚集索引条件下,页压缩(cluter index + page compression

Compression LOG 1.16 GB (1,248,985,088 bytes)

Shrink LOG 1.70 GB (1,828,716,544 bytes)

SELECT PageCompressedAgain = page_count FROM sys.dm_db_index_physical_stats (

DB_ID (),

OBJECT_ID ('table1'),

NULL, NULL, 'SAMPLED');

PageCompressedAgain

--------------------

133567

439130

Shrink:

Mar 29 2010 7:15AM

DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages

------ ----------- ----------- ----------- ----------- --------------

12 1 577032 256 577016 577016

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Mar 29 2010 7:25AM

耗时10 分钟

测试3:

删除聚集索引后做行压缩,之后收缩数据文件

Compression LOG 7.82 GB (8,404,074,496 bytes)

SELECT PageCompressedAgain = page_count FROM sys.dm_db_index_physical_stats (

DB_ID (),

OBJECT_ID ('table1'),

NULL, NULL, 'SAMPLED');

PageCompressedAgain

--------------------

541300

392331

Shrink --log 1.87 GB (2,011,627,520 bytes)

PageCompressedAgain

--------------------

541600

451801

Mar 26 2010 4:29PM

DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages

------ ----------- ----------- ----------- ----------- --------------

12 1 999512 256 999496 999496

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Mar 26 2010 7:04PM

耗时2小时35分钟

测试 4

删除聚集索引后做页压缩

compression log 140MB

shrink log 2.06 GB (2,212,823,040 bytes)

SELECT PageCompressedAgain = page_count FROM sys.dm_db_index_physical_stats (

DB_ID (),

OBJECT_ID ('table1'),

NULL, NULL, 'SAMPLED');

PageCompressedAgain

--------------------

127000

437707

Mar 29 2010 5:55PM

DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages

------ ----------- ----------- ----------- ----------- --------------

12 1 571048 256 571032 571032

Mar 29 2010 8:10PM

耗时2小时10分钟.

结论

1. 无论是row compression还是page compression ,有clustered index的情况下,shrink的性能都比没有clustered index的要快几十倍。

2. Row compression 的过程生成的log是page compression的4-5倍。

3. 在同样的compression模式下,没有clustered index的数据库shrink所生成的log 要略多于有clustered index的数据库。