Kompresi indeks cluster vs kompresi tabel - apakah mereka hal yang sama?

8

Jika saya mengatur kompresi (baik halaman atau baris) pada indeks berkerumun tabel, apakah itu sama dengan pengaturan kompresi di atas meja?

SQL Server menyediakan opsi untuk melakukan keduanya, yang menunjukkan bahwa mereka berbeda, tetapi saya mendapat kesan bahwa indeks berkerumun dan tabel pada dasarnya adalah hal yang sama, dan model mental saya tentang cara kerja indeks berkerumun memberitahu saya bahwa mengompresi indeks berkerumun juga harus mengompres tabel.

paH
sumber

Jawaban:

11

Jika saya mengatur kompresi (baik halaman atau baris) pada indeks berkerumun tabel, apakah itu sama dengan pengaturan kompresi di atas meja?

Iya.

Dari MSDN :

Gunakan sintaks REBUILD WITH untuk membangun kembali seluruh tabel termasuk semua partisi dalam tabel dipartisi. Jika tabel memiliki indeks berkerumun, opsi REBUILD membangun kembali indeks berkerumun.


SQL Server menyediakan opsi untuk melakukan keduanya, yang menunjukkan bahwa mereka berbeda

Alasan mengapa kedua sintaksis ada adalah karena tabel tidak selalu memiliki indeks berkerumun. Dengan kata lain, ALTER INDEX ALL ON ... REBUILDtidak mempengaruhi tumpukan (meskipun akan menyentuh semua nonclustereds), sehingga rute lain melayani tujuan itu.

Juga, sementara dokumentasi tidak secara eksplisit mengatakannya, ALTER TABLE ... REBUILDsintaksis tidak mengaktifkan / menonaktifkan kompresi semua indeks yang tidak tercakup pada tabel. Ini hanya mempengaruhi tumpukan atau indeks berkerumun.

Akhirnya, jika Anda menguji ini melalui SSMS, perlu diketahui bahwa Anda mungkin mendapatkan kesalahan saat menonaktifkan kompresi - skrip menyelesaikannya sehingga Anda dapat melihat apa yang sebenarnya terjadi.

Jon Seigel
sumber
Terima kasih Jon, penjelasan yang jelas dan bagus! Dan bagus untuk mendengar bahwa segala sesuatunya berjalan seperti yang saya harapkan seharusnya (yang jelas tidak selalu terjadi!)
paulH
4

Indeks berkerumun adalah tabel. Jadi, menyetelnya di kedua adalah sama. Anda dapat memvalidasi ini dengan membandingkan kedua kasus di sini:

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 juga menyediakan beberapa cara berbeda untuk membuat kolom menjadi unik:

CREATE TABLE dbo.foo1(bar INT UNIQUE);

...atau...

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

...atau...

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

...atau...

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

Ini semua akan berakhir dengan implementasi mendasar yang sama (dengan nama yang berbeda).

Hanya karena ada berbagai cara untuk mulai bekerja bukan berarti Anda tidak sampai di kantor. :-)

Aaron Bertrand
sumber