Чим відрізняється компресія на ПК до таблиці?


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 вказувався не один раз для таблиці або для принаймні одного з її розділів, якщо таблиця розміщена.

Чи є якась різниця в тому, щоб покласти це на ПК проти таблиці?


Як ви вважаєте, чи не було б різниці, якби первинний ключ не був кластерним стовпцем таблиці? :)
LowlyDBA

1
@JohnM: Я б так здогадався, але не знаю. (Ось чому я прошу :)
Vaccano

Відповіді:


14

Справа не в тому, щоб ставити компресію на первинний ключ, а натомість питання компресії на кластерний індекс . Для SQL Server кластерний індекс організовує фізичну структуру таблиці за цим індексом. Або, у коротшій формі, кластерний індекс - це таблиця. Це означає, що стиснення кластерного індексу та стиснення таблиці є функціонально еквівалентними. Якби ви створили свій основний ключ як некластеризований індекс і зберігали базову таблицю як купу, ці дві структури були б різними і стискалися окремо.


Що робити, якщо, відмовившись від усієї раціональності, ви зробили свій первинний ключ некластеризованим індексом і створили інший кластерний індекс? Чи буде тоді стиснення знову те саме?
Росс Пресер

1
Це не було б. Не думайте про первинний ключ тут, це не має значення. Нам потрібно зосередитись на індексах, кластеризованих та некластеризованих. Не можна окремо стискати кластерний індекс і таблицю, оскільки вони є одним і тим же об'єктом. кластерні індекси / таблиці та некластеризовані індекси - це різні об'єкти і їх потрібно стискати окремо.
Майк Фаль,

Я погано висловився. Ваша відповідь - це саме те, на що я їхав - кластерний індекс може бути стиснутий (що б він не індексував) або купу можна стиснути (якщо немає кластерного індексу), не обидва. І некластеризований індекс також можна стискати окремо.
Росс Пресер

Точно, але щоб було зрозуміло, ви не можете мати купу і кластерний індекс в одній таблиці. Це те чи інше. Через те, як поводиться SQL Server, люди часто плутають первинні ключі з кластерними індексами, тому я хочу переконатися, що різниця зрозуміла для цієї відповіді.
Майк Фаль,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.