Apa perbedaan antara kompresi pada PK vs pada Tabel?

9

Kompresi data dapat diatur di atas meja:

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)

Dan itu dapat didefinisikan pada kunci Utama:

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) 

Tetapi jika Anda menaruhnya di kedua maka Anda mendapatkan kesalahan ini:

Opsi DATA_COMPRESSION ditentukan lebih dari satu kali untuk tabel, atau setidaknya salah satu partisi jika tabel dipartisi.

Apakah ada perbedaan untuk meletakkannya di PK vs di atas meja?

Gunung berapi
sumber
Apakah Anda pikir akan ada perbedaan jika kunci primer bukan kolom dari tabel clustered? :)
LowlyDBA
1
@ JohnM: Saya kira begitu, tapi saya tidak tahu. (Itu sebabnya saya bertanya :)
Vaccano

Jawaban:

14

Ini bukan masalah menempatkan kompresi pada kunci primer, melainkan masalah menempatkan kompresi pada indeks berkerumun . Untuk SQL Server, indeks berkerumun mengatur struktur fisik tabel pada indeks itu. Atau, dalam bentuk yang lebih pendek, indeks berkerumun adalah tabel. Ini berarti bahwa mengompresi indeks berkerumun dan mengompresi tabel secara fungsional setara. Jika Anda membuat kunci utama Anda sebagai indeks non-cluster dan menyimpan tabel dasar sebagai tumpukan, kedua struktur ini akan berbeda dan dikompresi secara terpisah.

Mike Fal
sumber
Bagaimana jika, dengan menentang semua rasionalitas, Anda menjadikan kunci utama Anda sebagai indeks yang tidak berkerumun dan membuat indeks berkerumun yang berbeda? Apakah kompresi akan sama lagi?
Ross Presser
1
Tidak akan. Jangan pikirkan kunci primer di sini, itu tidak relevan. Kita perlu fokus pada indeks di sini, berkerumun dan tidak berkerumun. Anda tidak dapat secara terpisah mengompresi indeks dan tabel berkerumun karena mereka adalah objek yang sama. indeks cluster / tabel dan indeks non-cluster adalah objek yang berbeda dan harus dikompresi secara individual.
Mike Fal
Saya mengekspresikan diri saya dengan buruk. Jawaban Anda persis seperti apa yang saya kendarai - indeks berkerumun dapat dikompresi (apa pun yang diindeks) atau tumpukan dapat dikompresi (jika tidak ada indeks berkerumun), tidak keduanya. Dan indeks non-cluster juga dapat dikompresi, secara terpisah.
Ross Presser
Tepat, tetapi untuk menjadi jelas, Anda tidak dapat memiliki tumpukan dan indeks berkerumun di tabel yang sama. Itu satu atau yang lain. Karena bagaimana SQL Server berperilaku, itu umum bahwa orang-orang membingungkan kunci primer dengan indeks berkerumun, jadi saya ingin memastikan perbedaan dipahami untuk jawaban ini.
Mike Fal