SQL SERVER 的壓縮功能


請關注個人小站:http://sqlhis.com/

SQL SERVER 2008 及以上提供數據庫表壓縮功能

1. 壓縮分類和比率

  壓縮分為行(ROW)壓縮和頁(PAGE)壓縮,頁壓縮的壓縮比率更高一些,正常來說一般數據庫可以實現50%以上的壓縮比率。

2.對性能影響

  壓縮后對磁盤的壓力會減少,但是會增加CPU的壓力,對性能的影響需要看機器的具體配置,在實際中情況中,經常是CPU沒滿但是磁盤已滿負荷了。對備份恢復等極為有利,一個大數據庫,全備份常常要3-4小時,壓縮后,全備時間縮減到2小時。

 

以下代碼生成全庫的壓縮腳本,注意只是生成腳本,將生成的腳本貼到SQL執行窗口中執行即可。

 

 
         

/*SQL Server 2008 以上,自動進行表壓縮
直接運行生成的腳本文件即可
*/

 
         


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

 
         

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

 
         

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'

 
         

 

 
         

 

 
         

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

 
         


TRUNCATE TABLE #tablespaceinfo
INSERT #tablespaceinfo
EXEC sp_spaceused @l_tableName

 
         

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

 
         

END

 
         

--如果要查看壓縮項目,
--SELECT * FROM #Temp
--ORDER BY table_size ASC

 
         


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

 
         


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

WHILE @@FETCH_STATUS = 0
BEGIN

 
         

--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

 
         

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

 
         

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

CLOSE Info_cursor
DEALLOCATE Info_cursor

 
         


DROP TABLE #Temp
DROP TABLE #tablespaceinfo

 

 生成的腳本類似如下,直接黏貼到窗口中執行即可

ALTER TABLE [dbo].[AAAAAAAAAAA] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
RAISERROR('[dbo].[AAAAAAAAAAA] 已完成壓縮  原空間=0.00G',9,1) WITH NOWAIT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM