Sql-Server

如何將數據壓縮添加到表的主鍵?

  • November 26, 2019

我們使用大小超過 300GB 的表,其中一小部分錶使用稀疏列,儘管正如這個問題所示 ,這並不總是與 CPU 使用率一致。

對於不使用稀疏列的表,我想實現數據壓縮 -page或者row 取決於過程sp_estimate_data_compression_savings 或此腳本的結果:

用於估計壓縮節省的 T-SQL 腳本

我有一個常式可以生成執行良好的創建索引腳本

當我創建此表作為範例時:

IF OBJECT_ID('[DBO].[t1]') IS NOT NULL 
DROP TABLE [DBO].[t1] 
GO
CREATE TABLE [DBO].[t1] ( 
[a]  INT                              NOT NULL,
CONSTRAINT   [PK__t1__3BD0198E286DEFE4]  
PRIMARY KEY CLUSTERED    ([a] asc))

我的創建索引腳本給了我:

USE [ontime_new_test];
ALTER TABLE [dbo].[t1] 
ADD  CONSTRAINT [PK__t1__3BD0198E286DEFE4] 
PRIMARY KEY CLUSTERED (  [a] ASC  )  
WITH (  PAD_INDEX = OFF, FILLFACTOR = 100  , 
IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, 
DATA_COMPRESSION=NONE, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]  

問題:

有沒有辦法在不刪除主鍵的情況下對該表應用數據壓縮?

基本上我想完成這個(注意data_compression=PAGE),而不必先放棄任何約束:

USE [ontime_new_test];
ALTER TABLE [dbo].[t1] 
ADD  CONSTRAINT [PK__t1__3BD0198E286DEFE4] 
PRIMARY KEY CLUSTERED (  [a] ASC  )  
WITH (  PAD_INDEX = OFF, FILLFACTOR = 100  , 
IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, 
DATA_COMPRESSION=PAGE, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]  

有沒有辦法在不刪除主鍵的情況下對該表應用數據壓縮?

是的,您只需要執行以下命令即可重建聚集索引(在您的情況下,它也是 PK):

ALTER INDEX [PK__t1__3BD0198E286DEFE4] on TABLE [t1] 
REBUILD with (ONLINE = ON, DATA_COMPRESSION = PAGE)

"ONLINE = ON"子句可以幫助大大減少正在重建的表的鎖定

參考:ALTER INDEX (Transact-SQL)

是的,您可以在不刪除主鍵的情況下將數據壓縮到此表。保留您提到的所有選項,以下腳本將壓縮表格。此腳本不會壓縮任何非聚集索引。

ALTER INDEX [PK__t1__3BD0198E286DEFE4] on TABLE [t1] 
REBUILD WITH (PAD_INDEX = OFF, FILLFACTOR = 100, 
STATISTICS_NORECOMPUTE = OFF, DATA_COMPRESSION=PAGE, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION= PAGE, ONLINE=ON )

我添加了選項ONLINE=ON,但您也可以離線執行。閱讀`線上索引操作

引用自:https://dba.stackexchange.com/questions/254097