Sql-Server
如何將數據壓縮添加到表的主鍵?
我們使用大小超過 300GB 的表,其中一小部分錶使用稀疏列,儘管正如這個問題所示 ,這並不總是與 CPU 使用率一致。
對於不使用稀疏列的表,我想實現數據壓縮 -
page
或者row
取決於過程sp_estimate_data_compression_savings 或此腳本的結果:我有一個常式可以生成執行良好的創建索引腳本。
當我創建此表作為範例時:
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 [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
,但您也可以離線執行。閱讀`線上索引操作