前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL SERVER 的压缩功能

SQL SERVER 的压缩功能

作者头像
全栈程序员站长
发布2022-09-19 20:37:16
5720
发布2022-09-19 20:37:16
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

SQL SERVER 2008 及以上提供数据库表压缩功能

1. 压缩分类和比率

  压缩分为行(ROW)压缩和页(PAGE)压缩,页压缩的压缩比率更高一些,正常来说一般数据库可以实现50%以上的压缩比率。

2.对性能影响

  压缩后对磁盘的压力会减少,但是会增加CPU的压力,对性能的影响需要看机器的具体配置,在实际中情况中,经常是CPU没满但是磁盘已满负荷了。对备份恢复等极为有利,一个大数据库,全备份常常要3-4小时,压缩后,全备时间缩减到2小时。

以下代码生成全库的压缩脚本,注意只是生成脚本,将生成的脚本贴到SQL执行窗口中执行即可。

代码语言:javascript
复制

/*SQL Server 2008 以上,自动进行表压缩 直接运行生成的脚本文件即可 */

代码语言:javascript
复制

SET NOCOUNT ON CREATE TABLE #Temp ( table_name NVARCHAR(1000), index_name NVARCHAR(1000), table_size decimal(19,2) )

代码语言:javascript
复制

CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(500) , rowsinfo BIGINT , reserved VARCHAR(20) , datainfo VARCHAR(20) , index_size VARCHAR(20) , unused VARCHAR(20) )

代码语言:javascript
复制

INSERT #Temp(table_name,index_name) SELECT DISTINCT ‘[‘+SCHEMA_NAME(schema_id)+’].[‘+a.name+’]’, ‘[‘+c.name+’]’ FROM sys.tables a INNER JOIN sys.partitions b ON a.object_id=b.object_id AND b.data_compression=0 INNER JOIN sys.indexes c ON a.object_id=c.object_id AND b.index_id=c.index_id WHERE a.type=’U’ AND SCHEMA_NAME(schema_id)!=’cdc’

代码语言:javascript
复制
代码语言:javascript
复制
代码语言:javascript
复制

DECLARE @l_tableName NVARCHAR(max) WHILE EXISTS(SELECT * FROM #Temp WHERE table_size IS NULL) BEGIN SELECT TOP 1 @l_tableName=table_name FROM #Temp WHERE table_size IS NULL

代码语言:javascript
复制

TRUNCATE TABLE #tablespaceinfo INSERT #tablespaceinfo EXEC sp_spaceused @l_tableName

代码语言:javascript
复制

UPDATE #Temp SET table_size=(SELECT CAST(REPLACE(reserved, ‘KB’, ”) AS INT)*1.0/1024/1024 FROM #tablespaceinfo) WHERE table_name=@l_tableName

代码语言:javascript
复制

END

代码语言:javascript
复制

–如果要查看压缩项目, –SELECT * FROM #Temp –ORDER BY table_size ASC

代码语言:javascript
复制

DECLARE @tablename NVARCHAR(255); DECLARE @indexname NVARCHAR(255) DECLARE @tablesize decimal(19,2) DECLARE @sql NVARCHAR(MAX) DECLARE @message NVARCHAR(MAX) DECLARE Info_cursor CURSOR FOR SELECT table_name,index_name,table_size FROM #Temp ORDER BY table_size ASC

代码语言:javascript
复制

OPEN Info_cursor FETCH NEXT FROM Info_cursor INTO @tablename ,@indexname,@tablesize

WHILE @@FETCH_STATUS = 0 BEGIN

代码语言:javascript
复制

–ALTER INDEX [MF_NVChange_ID] ON [dbo].[MF_NVChange] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE) IF @indexname IS NOT NULL BEGIN SET @sql =’ALTER INDEX ‘+@indexname+ ‘ ON ‘ +@tablename + ‘ REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)’ SET @message=’RAISERROR(”’+ @indexname +’ ON ‘+@tablename+’ 已完成压缩 原空间=’+CAST(@tablesize AS nvarchar(30))+’G”,9,1) WITH NOWAIT’ END ELSE BEGIN SET @sql =’ALTER TABLE ‘ +@tablename + ‘ REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)’ SET @message=’RAISERROR(”’+@tablename+’ 已完成压缩 原空间=’+CAST(@tablesize AS nvarchar(30))+’G”,9,1) WITH NOWAIT’ END

代码语言:javascript
复制

PRINT @sql PRINT @message –RAISERROR( @message,9,1)

代码语言:javascript
复制

FETCH NEXT FROM Info_cursor INTO @tablename ,@indexname ,@tablesize END

CLOSE Info_cursor DEALLOCATE Info_cursor

代码语言:javascript
复制

DROP TABLE #Temp DROP TABLE #tablespaceinfo

代码语言:javascript
复制

生成的脚本类似如下,直接黏贴到窗口中执行即可

代码语言:javascript
复制
ALTER TABLE [dbo].[AAAAAAAAAAA] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
RAISERROR('[dbo].[AAAAAAAAAAA] 已完成压缩  原空间=0.00G',9,1) WITH NOWAIT

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/166637.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档