Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Programy SQL Server, Azure SQL Database i Azure SQL Managed Instance obsługują kompresję wierszy i stron dla tabel i indeksów składów wierszy oraz obsługują kompresję kolumn i archiwalną kompresję kolumn dla tabel i indeksów składów kolumn.
W przypadku tabel i indeksów rowstore użyj funkcji kompresji danych, aby zmniejszyć rozmiar bazy danych. Oprócz oszczędzania miejsca kompresja danych może pomóc zwiększyć wydajność obciążeń intensywnie korzystających z operacji we/wy, ponieważ dane są przechowywane na mniejszej liczbie stron i zapytania muszą odczytywać mniej stron z dysku. Jednak na serwerze bazy danych potrzebne są dodatkowe zasoby procesora CPU do kompresowania i dekompresowania danych podczas wymieniania danych z aplikacją. Kompresję wierszy i stron można skonfigurować na następujących obiektach bazy danych:
- Cała tabela przechowywana jako sterta.
- Cała tabela przechowywana jako indeks klastrowany.
- Cały indeks nieklastrowany.
- Cały indeksowany widok.
- W przypadku partycjonowanych tabel i indeksów można skonfigurować opcję kompresji dla każdej partycji, a różne partycje obiektu nie muszą mieć tego samego ustawienia kompresji.
W przypadku tabel i indeksów magazynu kolumn wszystkie tabele i indeksy magazynu kolumn zawsze używają kompresji magazynu kolumn i nie jest to możliwe do skonfigurowania przez użytkownika. Użyj kompresji archiwalnej magazynu kolumn, aby dodatkowo zmniejszyć rozmiar danych w sytuacjach, w których można sobie pozwolić na dodatkowy czas i zasoby procesora CPU do przechowywania i pobierania danych. Kompresję archiwalną magazynu kolumn można skonfigurować na następujących obiektach bazy danych:
- Cała tabela magazynu kolumn lub cały klastrowany indeks magazynu kolumn. Ponieważ tabela magazynu kolumn jest przechowywana jako indeks klastrowanego magazynu kolumn, oba podejścia mają te same wyniki.
- Cały nieklastrowany indeks magazynujący kolumny.
- W przypadku partycjonowanych tabel magazynu kolumn i indeksów magazynu kolumn można skonfigurować opcję kompresji archiwalnej dla każdej partycji, a różne partycje nie muszą mieć tego samego ustawienia kompresji archiwalnej.
Uwaga / Notatka
Dane można również skompresować przy użyciu formatu algorytmu GZIP. Jest to dodatkowy krok i jest najbardziej odpowiedni do kompresowania części danych podczas archiwizowania starych danych na potrzeby przechowywania długoterminowego. Nie można indeksować danych skompresowanych przy użyciu COMPRESS
funkcji . Aby uzyskać więcej informacji, zobacz COMPRESS (Transact-SQL).
Zagadnienia dotyczące kompresji wierszy i stron
W przypadku korzystania z kompresji wierszy i stron należy pamiętać o następujących kwestiach:
Szczegóły kompresji danych mogą ulec zmianie bez powiadomienia w dodatku Service Pack lub kolejnych wersjach.
Kompresja jest dostępna w usłudze Azure SQL Database
Kompresja nie jest dostępna w każdej wersji programu SQL Server. Aby uzyskać więcej informacji, zobacz listę wersji i obsługiwanych funkcji na końcu tej sekcji.
Kompresja nie jest dostępna dla tabel systemowych.
Kompresja może zezwalać na przechowywanie większej liczby wierszy na stronie, ale nie zmienia maksymalnego rozmiaru wiersza tabeli ani indeksu.
Nie można włączyć tabeli pod kątem kompresji, gdy maksymalny rozmiar wiersza oraz obciążenie kompresji przekracza maksymalny rozmiar wiersza wynoszący 8060 bajtów. Na przykład tabela zawierająca kolumny
c1 CHAR(8000)
ic2 CHAR(53)
nie można jej skompresować ze względu na dodatkowe obciążenie kompresji. Gdy jest używany format magazynu vardecimal , sprawdzanie rozmiaru wiersza jest wykonywane po włączeniu formatu. W przypadku kompresji wierszy i stron sprawdzanie rozmiaru wiersza jest wykonywane po początkowym skompresowaniu obiektu, a następnie sprawdzane, gdy każdy wiersz jest wstawiany lub modyfikowany. Kompresja wymusza następujące dwie reguły:- Aktualizacja typu o stałej długości musi zawsze zakończyć się powodzeniem.
- Wyłączenie kompresji danych musi zawsze zakończyć się powodzeniem. Nawet jeśli skompresowany wiersz mieści się na stronie, co oznacza, że jest to mniej niż 8060 bajtów; Program SQL Server uniemożliwia aktualizowanie, które nie mieszczą się w wierszu, gdy nie jest on dekompresowany.
Dane poza wierszem nie są kompresowane podczas włączania kompresji danych. Na przykład rekord XML, który jest większy niż 8060 bajtów, używa stron poza wierszem, które nie są kompresowane.
Kompresja danych nie ma wpływu na kilka typów danych. Aby uzyskać więcej szczegółów, zobacz Jak kompresja wierszy wpływa na przechowywanie.
Po określeniu listy partycji można ustawić typ kompresji na
ROW
,PAGE
lubNONE
na poszczególnych partycjach. Jeśli lista partycji nie jest określona, wszystkie partycje są ustawiane z właściwością kompresji danych, która jest określona w instrukcji . Po utworzeniu tabeli lub indeksu kompresja danych jest ustawiona na NONE, chyba że określono inaczej. Po zmodyfikowaniu tabeli istniejąca kompresja jest zachowywana, chyba że określono inaczej.Jeśli określisz listę partycji lub partycję, która jest poza zakresem, zostanie wygenerowany błąd.
Indeksy nieklastrowane nie dziedziczą właściwości kompresji tabeli. Aby skompresować indeksy, należy jawnie ustawić właściwość kompresji indeksów. Domyślnie ustawienie kompresji indeksów jest ustawione na NONE podczas tworzenia indeksu.
Po utworzeniu klastrowanego indeksu na stercie indeks klastrowany dziedziczy stan kompresji sterta, chyba że określono alternatywny stan kompresji.
Gdy sterta jest skonfigurowana do kompresji na poziomie strony, strony odbierają kompresję na poziomie strony tylko w następujący sposób:
- Dane są importowane zbiorczo z włączonymi optymalizacjami zbiorczymi.
- Dane są wstawiane przy użyciu
INSERT INTO ... WITH (TABLOCK)
składni, a tabela nie ma indeksu nieklastrowanego. - Tabela zostanie ponownie skompilowana przez wykonanie instrukcji
ALTER TABLE ... REBUILD
z opcjąPAGE
kompresji.
Nowe strony przydzielone w stercie w ramach operacji DML nie używają
PAGE
kompresji, dopóki sterta nie zostanie ponownie skompilowana. Ponownie skompiluj stertę, usuwając i ponownie stosując kompresję lub tworząc i usuwając indeks klastrowany.Zmiana ustawienia kompresji sterty wymaga przebudowy wszystkich indeksów nieklastrowanych w tabeli, aby miały wskaźniki do nowych lokalizacji wierszy w stercie.
Możesz włączyć lub wyłączyć
ROW
lubPAGE
kompresję w trybie online lub offline. Włączenie kompresji na stercie jest pojedyncze wątkowe dla operacji online.Wymagania dotyczące miejsca na dysku dotyczące włączania lub wyłączania kompresji wierszy lub stron są takie same jak w przypadku tworzenia lub ponownego kompilowania indeksu. W przypadku danych partycjonowanych można zmniejszyć ilość miejsca wymaganego przez włączenie lub wyłączenie kompresji dla jednej partycji naraz.
Aby określić stan kompresji partycji w tabeli partycjonowanej, wykonaj zapytanie do kolumny
data_compression
w widoku wykazusys.partitions
.Podczas kompresowania indeksów, strony na poziomie liścia można kompresować zarówno metodą kompresji wierszy, jak i kompresji strony. Strony, które nie są na poziomie liści, nie otrzymują kompresji danych strony.
Ze względu na ich rozmiar, typy danych dużego rozmiaru są czasami przechowywane oddzielnie od normalnych danych wierszy na specjalnych stronach przeznaczonych do tego celu. Kompresja danych nie jest dostępna dla danych przechowywanych oddzielnie.
Tabele z zaimplementowanym formatem magazynu vardecimal w programie SQL Server 2005 (9.x) zachowują to ustawienie po uaktualnieniu. Kompresję wierszy można zastosować do tabeli, która ma format przechowywania vardecimal. Jednak ponieważ kompresja danych wierszowych jest nadzbiorem formatu przechowywania vardecimal, nie ma powodu, aby zachować format przechowywania vardecimal. Wartości dziesiętne nie uzyskują dodatkowej kompresji, gdy jest używany format przechowywania vardecimal z kompresją wierszy. Kompresję strony można zastosować do tabeli, która ma format przechowywania vardecimal; jednak kolumny w formacie przechowywania vardecimal prawdopodobnie nie osiągną dodatkowej kompresji.
Uwaga / Notatka
Wszystkie obsługiwane wersje programu SQL Server obsługują format przechowywania vardecimal; jednak ponieważ kompresja danych osiąga te same cele, ten format jest przestarzały. Ta funkcja zostanie usunięta w przyszłej wersji programu SQL Server. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji.
Aby uzyskać listę funkcji obsługiwanych przez wersje programu SQL Server w systemie Windows, zobacz:
- Wersje i obsługiwane funkcje programu SQL Server 2025 Preview
- Wersje oraz dostępne funkcje programu SQL Server 2022
- Wersje i obsługiwane funkcje programu SQL Server 2019
- Wersje i obsługiwane funkcje programu SQL Server 2017
- Wersje i obsługiwane funkcje programu SQL Server 2016
Kompresja magazynu kolumn i archiwum magazynu kolumn
Tabele i indeksy kolumnowe są zawsze przechowywane przy użyciu kompresji kolumnowej. Można jeszcze bardziej zmniejszyć rozmiar danych magazynu kolumn, konfigurując dodatkową kompresję o nazwie kompresja archiwalna. Aby przeprowadzić kompresję archiwalną, program SQL Server uruchamia algorytm kompresji Microsoft XPRESS na danych. Dodaj lub usuń kompresję archiwalną przy użyciu następujących typów kompresji danych:
- Użyj
COLUMNSTORE_ARCHIVE
kompresji danych do kompresowania danych magazynu kolumnowego z kompresją archiwalną. - Użyj
COLUMNSTORE
kompresji danych do dekompresji kompresji archiwalnej. Wynikowe dane nadal są kompresowane za pomocą kompresji kolumnowej.
Aby dodać kompresję archiwalną, użyj polecenia ALTER TABLE (Transact-SQL) lub ALTER INDEX (Transact-SQL) z opcją REBUILD
i DATA COMPRESSION = COLUMNSTORE_ARCHIVE
.
Przykład:
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (2, 4)
);
Aby usunąć kompresję archiwalną i przywrócić dane do kompresji magazynu kolumn, użyj polecenia ALTER TABLE (Transact-SQL) lub ALTER INDEX (Transact-SQL) z opcją REBUILD
i DATA COMPRESSION = COLUMNSTORE
.
Przykład:
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
DATA_COMPRESSION = COLUMNSTORE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE ON PARTITIONS (2, 4)
);
W następnym przykładzie na niektórych partycjach ustawiono kompresję danych na columnstore, a na innych partycjach na columnstore archival.
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE
ON PARTITIONS (4, 5),
DATA COMPRESSION = COLUMNSTORE_ARCHIVE
ON PARTITIONS (1, 2, 3)
);
Wydajność
Podczas kompresowania indeksów magazynu kolumn z kompresją archiwalną indeks może działać wolniej niż indeksy magazynu kolumn, które nie mają kompresji archiwalnej. Kompresja archiwalna jest używana tylko wtedy, gdy można sobie pozwolić na wykorzystanie dodatkowego czasu i zasobów procesora w celu skompresowania i pobrania danych.
Zaletą kompresji archiwalnej jest zmniejszenie magazynu, co jest przydatne w przypadku danych, do których często nie uzyskuje się dostępu. Jeśli na przykład masz partycję dla każdego miesiąca danych, a większość aktywności dotyczy ostatnich miesięcy, możesz zarchiwizować starsze miesiące, aby zmniejszyć wymagania dotyczące magazynu.
Metadane
Następujące widoki systemowe zawierają informacje o kompresji danych dla indeksów klastrowanych:
-
sys.indexes (Transact-SQL) — kolumny
type
itype_desc
obejmująCLUSTERED COLUMNSTORE
iNONCLUSTERED COLUMNSTORE
. -
sys.partitions (Transact-SQL) — kolumny
data_compression
idata_compression_desc
obejmująCOLUMNSTORE
iCOLUMNSTORE_ARCHIVE
.
Procedura sp_estimate_data_compression_savings (Transact-SQL) może być również stosowana do indeksów magazynu kolumn.
Wpływ na partycjonowane tabele i indeksy
W przypadku korzystania z kompresji danych z partycjonowanych tabel i indeksów należy pamiętać o następujących kwestiach:
Gdy partycje są dzielone przy użyciu instrukcji
ALTER PARTITION
, obie partycje dziedziczą atrybut kompresji danych oryginalnej partycji.Po scaleniu dwóch partycji wynikowa partycja dziedziczy atrybut kompresji danych partycji docelowej.
Aby przełączyć partycję, właściwość kompresji danych partycji musi być zgodna z właściwością kompresji tabeli.
Istnieją dwie odmiany składni, których można użyć do modyfikowania kompresji partycjonowanej tabeli lub indeksu:
Następująca składnia ponownie kompiluje tylko przywołyną partycję:
ALTER TABLE <table_name> REBUILD PARTITION = 1 WITH ( DATA_COMPRESSION = <option> );
Następująca składnia odbudowuje całą tabelę przy użyciu istniejącego ustawienia kompresji dla wszystkich partycji, które nie są wymienione.
ALTER TABLE <table_name> REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = PAGE ON PARTITIONS(<range>), ... );
Indeksy partycjonowane stosują tę samą zasadę przy użyciu
ALTER INDEX
.Po usunięciu indeksu klastrowanego, partycje stert odpowiadające indeksowi zachowują ustawienie kompresji danych, chyba że schemat podziału na partycje zostanie zmodyfikowany. Jeśli schemat partycjonowania zostanie zmieniony, wszystkie partycje zostaną przebudowane do stanu nieskompresowanego. Aby usunąć indeks klastrowany i zmienić schemat partycjonowania, należy wykonać następujące czynności:
- Upuść indeks klastrowany.
- Zmodyfikuj
ALTER TABLE ... REBUILD
tabelę przy użyciu opcji określającej opcję kompresji.
Aby usunąć indeks
OFFLINE
klastrowany, jest szybką operacją, ponieważ usuwane są tylko górne poziomy indeksów klastrowanych. Po usunięciuONLINE
klastrowanego indeksu program SQL Server musi ponownie skompilować stertę dwa razy, raz dla kroku 1 i raz dla kroku 2.
Jak kompresja wpływa na replikację
W przypadku korzystania z kompresji danych z replikacją należy pamiętać o następujących kwestiach:
Gdy agent migawek generuje początkowy skrypt schematu, nowy schemat używa tych samych ustawień kompresji zarówno dla tabeli, jak i jej indeksów. Kompresja nie może być włączona tylko w tabeli, a nie w indeksie.
W przypadku replikacji transakcyjnej opcje schematu artykułu określają, jakie obiekty zależne i właściwości muszą być skryptowane. Aby uzyskać więcej informacji, zobacz sp_addarticle.
Agent dystrybucji nie sprawdza subskrybentów na poziomie podrzędnym, gdy stosuje skrypty. Jeśli wybrano replikację kompresji, tworzenie tabeli na starszych subskrybentach nie uda się. W przypadku topologii mieszanej nie należy włączać replikacji kompresji.
W przypadku replikacji scalania poziom zgodności publikacji zastępuje opcje schematu i określa obiekty schematu, które są generowane w skryptach.
W przypadku topologii mieszanej, jeśli nie jest wymagana obsługa nowych opcji kompresji, poziom zgodności publikacji powinien być ustawiony na wersję subskrybenta na poziomie podrzędnym. Jeśli jest to wymagane, skompresuj tabele na subskrybencie po ich stworzeniu.
W poniższej tabeli przedstawiono ustawienia replikacji kontrolujące kompresję podczas replikacji.
Intencja użytkownika | Replikowanie schematu partycji dla tabeli lub indeksu | Replikowanie ustawień kompresji | Zachowanie skryptowania |
---|---|---|---|
Aby replikować schemat partycji i włączyć kompresję dla subskrybenta na konkretnej partycji. | Prawda | Prawda | Zarządza skryptami zarówno schematem partycji, jak i ustawieniami kompresji. |
Aby replikować schemat partycji, ale nie kompresować danych u subskrybenta. | Prawda | Nieprawda | Skryptuje schemat partycji, ale nie ustawienia kompresji partycji. |
Nie replikować schematu partycji i nie kompresować danych na subskrybencie. | Nieprawda | Nieprawda | Nie skryptuje ustawień partycji ani kompresji. |
Aby skompresować tabelę dla subskrybenta, jeśli wszystkie partycje są skompresowane na wydawcy, ale nie replikować schematu partycji. | Nieprawda | Prawda | Sprawdza, czy wszystkie partycje są włączone do kompresji. Wyłącza kompresję na poziomie tabeli. |
Wpływ na inne składniki programu SQL Server
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Kompresja odbywa się w Mechanizmie bazy danych, a dane są prezentowane większości innych składników programu SQL Server w stanie niezkompresowanym. Ogranicza to wpływ kompresji na inne składniki do następujących czynników:
- Operacje importowania i eksportowania zbiorczego
- Gdy dane są eksportowane, nawet w formacie natywnym, dane są wyjściowe w formacie nieskompresowanego wiersza. Może to spowodować, że rozmiar wyeksportowanego pliku danych będzie znacznie większy niż dane źródłowe.
- Gdy dane są importowane, jeśli tabela docelowa została włączona na potrzeby kompresji, aparat bazy danych konwertuje dane na skompresowany format wiersza. Może to spowodować zwiększenie użycia procesora CPU w porównaniu z danymi importowanymi do nieskompresowanej tabeli.
- Gdy dane są importowane zbiorczo do sterta z kompresją strony, operacja importowania zbiorczego próbuje skompresować dane z kompresją strony po wstawieniu danych.
- Kompresja nie ma wpływu na tworzenie kopii zapasowych i przywracanie.
- Kompresja nie ma wpływu na wysyłkę dziennika.
- Kompresja danych jest niezgodna z rozrzednymi kolumnami. W związku z tym tabele zawierające kolumny rozrzedzone nie mogą być kompresowane ani nie mogą być dodawane do skompresowanej tabeli.
- Włączenie kompresji może spowodować zmianę planów zapytań, ponieważ dane są przechowywane przy użyciu innej liczby stron i liczby wierszy na stronę.