web-dev-qa-db-ja.com

テーブルの主キーにデータ圧縮を追加する方法

300 GBを超えるサイズのテーブルを操作しますが、その一部は スパース列 を使用しますが、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))

create index scripts は私に与えます:

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

主キーを削除せずにこのテーブルにデータ圧縮を適用する方法はありますか?

はい、以下のコマンドを実行してクラスター化インデックスを再構築する必要があります(あなたの場合はPKでもあります)。

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

"ONLINE = ON"句は、再構築中のテーブルのロックを大幅に削減するのに役立ちます

1
Aleksey Vitsko

リファレンス: 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を追加しましたが、オフラインで実行することもできます。 `オンラインインデックス操作を読む

1
SqlWorldWide