Сжатие кластерных индексов и сжатие таблиц - это одно и то же?

8

Если я устанавливаю сжатие (либо страницу, либо строку) для кластеризованного индекса таблицы, это то же самое, что установка сжатия для таблицы?

SQL Server предоставляет варианты для того и другого, что говорит о том, что они разные, но у меня сложилось впечатление, что кластеризованный индекс и таблица - это одно и то же, и моя ментальная модель работы кластеризованных индексов говорит мне, что сжатие кластеризованного индекса Также необходимо сжать стол.

paulH
источник

Ответы:

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

Все они в конечном итоге будут иметь одну и ту же базовую реализацию (с разными именами).

То, что есть разные способы добраться до работы, не означает, что вы все равно не окажетесь в офисе. :-)

Аарон Бертран
источник