クラスタ化インデックスの圧縮とテーブルの圧縮-それらは同じものですか?


8

テーブルのクラスター化インデックスに圧縮(ページまたは行)を設定した場合、それはテーブルに圧縮を設定することと同じですか?

SQL Serverは両方を実行するためのオプションを提供しますが、それらは異なることを示唆していますが、クラスター化インデックスとテーブルは基本的に同じものであるという印象を受けました。クラスター化インデックスの動作のメンタルモデルは、クラスター化インデックスを圧縮するテーブルも圧縮する必要があります。

回答:


11

テーブルのクラスター化インデックスに圧縮(ページまたは行)を設定した場合、それはテーブルに圧縮を設定することと同じですか?

はい。

MSDNから:

REBUILD WITH構文を使用して、パーティション分割テーブルのすべてのパーティションを含むテーブル全体を再構築します。テーブルにクラスター化インデックスがある場合、REBUILDオプションはクラスター化インデックスを再構築します。


SQL Serverは両方を実行するためのオプションを提供し、それらは異なることを示唆しています

両方の構文が存在する理由は、テーブルに必ずしもクラスター化インデックスあるとは限らないためです。言い換えるとALTER INDEX ALL ON ... REBUILD、ヒープには影響しません(ただし、クラスター化されていないものすべてに影響します)ので、他のルートがその目的を果たします。

また、ドキュメントでは明示的にそのように述べてALTER TABLE ... REBUILDいませんが、構文ではテーブルのすべての非クラスター化インデックスの圧縮を有効/無効にしませ。ヒープまたはクラスター化インデックスにのみ影響します。

最後に、これをSSMSでテストしている場合は、圧縮を無効にするとエラーが発生する可能性があることに注意してください。実際に何が行われているのかを確認できるようにスクリプトを実行してください。


ジョンさん、わかりやすく説明してくれてありがとう!そして、私が期待どおりに機能することを聞いて
うれしい

4

クラスタ化インデックスはテーブルです。したがって、どちらに設定しても同じです。ここで両方のケースを比較することでこれを検証できます。

SELECT OBJECT_NAME(p.object_id),*
 FROM sys.partitions AS p
 INNER Join sys.indexes AS i 
 ON p.object_id = i.object_id 
 AND p.index_id = i.index_id
 WHERE p.data_compression > 0;

SQL Serverには、列を一意にするいくつかの方法もあります。

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...または...

CREATE TABLE dbo.foo2(bar INT, CONSTRAINT x2 UNIQUE(bar));

...または...

CREATE TABLE dbo.foo3(bar INT);
ALTER TABLE dbo.foo3 ADD CONSTRAINT x3 UNIQUE(bar);

...または...

CREATE TABLE dbo.foo4(bar INT);
CREATE UNIQUE INDEX x4 ON dbo.foo4(bar);

これらはすべて、同じ基盤となる実装(名前は異なります)になります。

仕事に就くためのさまざまな方法があるからといって、まだオフィスにいるわけではありません。:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.