Чем отличается сжатие на ПК от таблицы?

9

Сжатие данных можно установить на столе:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 )
) ON SomePartitionScheme(SomeId) WITH (DATA_COMPRESSION=PAGE)

И это можно определить по первичному ключу:

CREATE TABLE dbo.SomeTable(
    SomeId [bigint] NOT NULL,
    OtherId [bigint] NOT NULL,
    IsActive [bit] NOT NULL,
 CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
 (
    SomeId Desc
 ) WITH (DATA_COMPRESSION=PAGE)
) ON SomePartitionScheme(SomeId) 

Но если вы поместите его в оба, вы получите эту ошибку:

Опция DATA_COMPRESSION была указана более одного раза для таблицы или хотя бы для одного из ее разделов, если таблица разбита на разделы.

Есть ли разница в том, чтобы положить его на ПК против стола?

Vaccano
источник
Как вы думаете, будет ли разница, если первичный ключ не будет кластеризованным столбцом таблицы? :)
LowlyDBA
1
@JohnM: я бы догадался, но я не знаю. (Вот почему я спрашиваю :)
Vaccano

Ответы:

14

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

Майк Фал
источник
Что если, вопреки всей рациональности, вы сделали свой первичный ключ некластеризованным индексом и создали другой кластеризованный индекс? Будет ли сжатие снова таким же?
Росс Прессер,
1
Это не будет. Не думайте о первичном ключе здесь, это не имеет значения. Мы должны сосредоточиться на индексах здесь, кластеризованных и некластеризованных. Вы не можете отдельно сжать кластеризованный индекс и таблицу, потому что это один и тот же объект. Кластерные индексы / таблицы и некластеризованные индексы являются разными объектами и должны быть сжаты по отдельности.
Майк Фал
Я выразил себя плохо. Ваш ответ - именно то, к чему я стремился - кластерный индекс может быть сжат (независимо от того, что он индексирует) или куча может быть сжата (если нет кластерного индекса), но не оба. И некластеризованный индекс также может быть сжат отдельно.
Росс Прессер
Точно, но, чтобы было ясно, вы не можете иметь кучу и кластеризованный индекс в одной и той же таблице. Это одно или другое. Из-за поведения SQL Server люди часто путают первичные ключи с кластерными индексами, поэтому я хочу убедиться, что для этого ответа понятна разница.
Майк Фал