テーブルのクラスター化インデックスに圧縮(ページまたは行)を設定した場合、それはテーブルに圧縮を設定したことと同じですか?
SQL Serverは両方を実行するためのオプションを提供しますが、それらは異なることを示唆していますが、クラスター化インデックスとテーブルは本質的に同じものであるという印象を受けました。クラスター化インデックスの動作の私のメンタルモデルは、クラスター化インデックスを圧縮するテーブルも圧縮する必要があります。
テーブルのクラスター化インデックスに圧縮(ページまたは行)を設定した場合、それはテーブルに圧縮を設定することと同じですか?
はい。
から [〜#〜] msdn [〜#〜] :
REBUILD WITH構文を使用して、パーティション分割テーブルのすべてのパーティションを含むテーブル全体を再構築します。テーブルにクラスター化インデックスがある場合、REBUILDオプションはクラスター化インデックスを再構築します。
SQL Serverは、両方を実行するためのオプションを提供します。これは、それらが異なることを示唆しています
両方の構文が存在する理由は、テーブルが必ずしもクラスター化インデックスを持っていないためです。言い換えると、 ALTER INDEX ALL ON ... REBUILD
はヒープに影響を与えません(すべての非クラスターに影響します)ので、他のルートがその目的を果たします。
また、ドキュメントには明示的には記載されていませんが、ALTER TABLE ... REBUILD
構文は、ではなくすべての非クラスター化インデックスの圧縮を有効/無効にしますテーブル。ヒープまたはクラスター化インデックスにのみ影響します。
最後に、これをSSMSでテストしている場合は、圧縮を無効にすると エラーが発生する可能性があります スクリプトを実行して、実際に何が行われているのかを確認できるようにしてください。
クラスタ化インデックスはテーブルです。したがって、どちらに設定しても同じです。ここで両方のケースを比較することでこれを検証できます。
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);
これらはすべて、同じ基盤となる実装(異なる名前)になります。
仕事をするためのさまざまな方法があるからといって、まだオフィスにいるわけではありません。 :-)