Jaka jest różnica między kompresją na PK a tabelą?

9

Kompresję danych można ustawić w tabeli:

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)

Można to zdefiniować na kluczu podstawowym:

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) 

Ale jeśli umieścisz to na obu, otrzymasz następujący błąd:

Opcja DATA_COMPRESSION została określona więcej niż raz dla tabeli lub przynajmniej dla jednej z jej partycji, jeśli tabela jest podzielona na partycje.

Czy jest jakaś różnica w umieszczaniu go na PK vs. na stole?

Vaccano
źródło
Czy uważasz, że byłaby różnica, gdyby kluczem podstawowym nie była klastrowana kolumna tabeli? :)
LowlyDBA
1
@JohnM: Tak sądzę, ale nie wiem. (Dlatego pytam :)
Vaccano

Odpowiedzi:

14

Nie chodzi o kompresję klucza podstawowego, ale o kompresję indeksu klastrowego . W przypadku SQL Server indeks klastrowy organizuje strukturę fizyczną tabeli na tym indeksie. Lub, w skrócie, indeks klastrowany jest tabelą. Oznacza to, że kompresja indeksu klastrowanego i kompresja tabeli są funkcjonalnie równoważne. Jeśli utworzysz klucz podstawowy jako indeks nieklastrowany i utrzymasz tabelę podstawową jako stertę, te dwie struktury byłyby inne i osobno skompresowane.

Mike Fal
źródło
Co jeśli, wbrew wszelkiej racjonalności, uczyniłeś swój klucz podstawowy indeksem nieklastrowanym i stworzyłeś inny indeks klastrowany? Czy kompresja byłaby wtedy taka sama?
Ross Presser,
1
Nie zrobiłby tego. Nie myśl o kluczu podstawowym tutaj, jest nieistotny. Musimy skupić się na indeksach tutaj, klastrowanych i nieklastrowanych. Nie można osobno skompresować indeksu klastrowego i tabeli, ponieważ są one tym samym obiektem. indeksy / tabele klastrowane i indeksy nieklastrowane są różnymi obiektami i muszą być indywidualnie kompresowane.
Mike Fal
Źle się wyraziłem. Twoja odpowiedź jest dokładnie tym, do czego dążyłem - indeks klastrowany można skompresować (niezależnie od tego, co indeksuje) lub stertę można skompresować (jeśli nie ma indeksu klastrowanego), a nie oba. Indeks nieklastrowany można również osobno skompresować.
Ross Presser,
Dokładnie, ale dla jasności nie można mieć sterty i indeksu klastrowego w tej samej tabeli. To jedno lub drugie. Ze względu na to, jak zachowuje się SQL Server, ludzie często mylą klucze podstawowe z indeksami klastrowymi, dlatego chcę się upewnić, że dla tej odpowiedzi zrozumiano różnicę.
Mike Fal