web-dev-qa-db-ja.com

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

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

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

8
paulH

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

はい。

から [〜#〜] msdn [〜#〜]

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


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

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

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

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

11
Jon Seigel

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

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

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

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

4
Aaron Bertrand