Komprese dat

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

SQL Server, Azure SQL Database a Azure SQL Managed Instance podporují kompresi řádků a stránek pro tabulky a indexy úložiště řádků a podporují kompresi sloupcového úložiště a archivní kompresi sloupcového úložiště pro tabulky a indexy sloupcového úložiště.

U tabulek a indexů rowstore použijte funkci komprese dat, která pomáhá zmenšit velikost databáze. Kromě úspory místa může komprese dat pomoct zlepšit výkon úloh náročných na vstupně-výstupní operace, protože data jsou uložená na méně stránkách a dotazy potřebují číst méně stránek z disku. Ke kompresi a dekompresi dat vyměňovaných s aplikací se však na databázovém serveru vyžadují další prostředky procesoru. Kompresi řádků a stránek můžete nakonfigurovat u následujících databázových objektů:

  • Celá tabulka, která je uložená jako halda.
  • Celá tabulka, která je uložená jako clusterovaný index.
  • Celý neclusterovaný index.
  • Celé indexované zobrazení.
  • U dělených tabulek a indexů můžete nakonfigurovat možnost komprese pro každý oddíl a různé oddíly objektu nemusí mít stejné nastavení komprese.

U tabulek a indexů columnstore všechny tabulky a indexy columnstore vždy používají kompresi columnstore a to není možné konfigurovat uživatelem. Pomocí archivační komprese columnstore můžete dále zmenšit velikost dat v situacích, kdy si můžete dovolit další čas a prostředky procesoru pro ukládání a načítání dat. Archivní kompresi columnstore můžete nakonfigurovat u následujících databázových objektů:

  • Celá tabulka columnstore nebo celý clusterovaný index columnstore. Vzhledem k tomu, že columnstore tabulka je uložena jako seskupený columnstore index, dosahují oba přístupy stejných výsledků.
  • Celý neklastrovaný columnstore index.
  • U dělených tabulek columnstore a indexů columnstore můžete pro každý oddíl nakonfigurovat možnost archivace komprese a různé oddíly nemusí mít stejné nastavení archivace komprese.

Poznámka:

Data lze také komprimovat pomocí formátu algoritmu GZIP. Jedná se o další krok, který je nejvhodnější pro komprimaci částí dat při archivaci starých dat pro dlouhodobé ukládání. Data komprimovaná pomocí COMPRESS funkce nelze indexovat. Další informace naleznete v tématu COMPRESS (Transact-SQL).

Aspekty komprese řádků a stránek

Při použití komprese řádků a stránek mějte na paměti následující aspekty:

  • Podrobnosti o kompresi dat se můžou změnit bez předchozího upozornění v aktualizacích Service Pack nebo následných verzích.

  • Komprese je dostupná ve službě Azure SQL Database.

  • Komprese není dostupná v každé edici SQL Serveru. Další informace najdete v seznamu edic a podporovaných funkcí na konci této části.

  • Komprese není dostupná pro systémové tabulky.

  • Komprese umožňuje ukládání více řádků na stránce, ale nemění maximální velikost řádku tabulky nebo indexu.

  • Tabulku nelze povolit pro kompresi, pokud maximální velikost řádku plus režie komprese překročí maximální velikost řádku 8 060 bajtů. Například tabulka, která obsahuje sloupce c1 CHAR(8000) a c2 CHAR(53) nelze ji zkomprimovat kvůli dodatečné režii komprese. Při použití formátu úložiště vardecimal se při povolení formátu provede kontrola velikosti řádku. U komprese řádků a stránek se kontrola velikosti řádku provádí při počáteční komprimaci objektu a pak se kontroluje, jak se každý řádek vloží nebo upraví. Komprese vynucuje následující dvě pravidla:

    • Aktualizace typu pevné délky musí vždy proběhnout úspěšně.
    • Zakázání komprese dat musí být vždy úspěšné. I když se komprimovaný řádek vejde na stránku, znamená to, že je menší než 8 060 bajtů; SQL Server zabraňuje aktualizacím, které se nevejdou na řádek, když je nekomprimovaný.
  • Při povolování komprese dat se data mimo řádky nekomprimují. Například záznam XML, který je větší než 8 060 bajtů, používá stránky mimo řádky, které nejsou komprimované.

  • Komprese dat nemá vliv na několik datových typů. Další podrobnosti najdete v tématu Jak komprese řádků ovlivňujeúložiště .

  • Při zadání seznamu oddílů lze typ komprese nastavit na ROW, PAGEnebo NONE na jednotlivé oddíly. Pokud není zadaný seznam oddílů, jsou všechny oddíly nastaveny pomocí vlastnosti komprese dat, která je zadána v příkazu. Při vytvoření tabulky nebo indexu je komprese dat nastavena na HODNOTU NONE, pokud není zadáno jinak. Při úpravě tabulky se stávající komprese zachová, pokud není zadáno jinak.

  • Pokud zadáte seznam oddílů nebo oddíl, který je mimo rozsah, vygeneruje se chyba.

  • Neclusterované indexy nedědí vlastnost komprese tabulky. Chcete-li komprimovat indexy, musíte explicitně nastavit vlastnost komprese indexů. Ve výchozím nastavení je nastavení komprese pro indexy při vytváření indexu nastaveno na HODNOTU NONE.

  • Při vytvoření clusterovaného indexu v haldě clusterovaný index zdědí stav komprese haldy, pokud není zadán alternativní stav komprese.

  • Pokud je halda nakonfigurovaná pro kompresi na úrovni stránky, stránky obdrží kompresi na úrovni stránky pouze následujícími způsoby:

    • Data se hromadně importují se zapnutými hromadnými optimalizacemi.
    • Data se vkládají pomocí INSERT INTO ... WITH (TABLOCK) syntaxe a tabulka nemá neclusterovaný index.
    • Tabulka se znovu sestaví spuštěním ALTER TABLE ... REBUILD příkazu s PAGE možností komprese.
  • Nové stránky v haldě, přidělené jako součást operací DML, nepoužívají kompresi PAGE, dokud není halda znovu sestavena. Znovu sestavte haldu odebráním a opětovným použitím komprese, nebo vytvořením a následným odebráním clustrovaného indexu.

  • Změna nastavení komprese haldy vyžaduje, aby byly všechny neclusterované indexy v tabulce znovu sestaveny tak, aby měly ukazatele na nová umístění řádků v haldě.

  • Můžete povolit nebo zakázat kompresi ROW nebo PAGE online nebo offline. Povolení komprese haldy je jedno vlákno pro online operaci.

  • Požadavky na místo na disku pro povolení nebo zakázání komprese řádků nebo stránek jsou stejné jako při vytváření nebo opětovném sestavení indexu. U dělených dat můžete zmenšit místo potřebné povolením nebo zakázáním komprese pro jeden oddíl najednou.

  • Pokud chcete určit stav komprese oddílů v dělené tabulce, zadejte dotaz na data_compression sloupec sys.partitions zobrazení katalogu.

  • Při komprimaci indexů lze stránky na úrovni listu komprimovat pomocí komprese řádků i stránek. Stránky, které nejsou na úrovni listu, neobdrží kompresi stránek.

  • Vzhledem k jejich velikosti se datové typy s velkými hodnotami někdy ukládají odděleně od normálních dat řádků na stránkách speciálních účelů. Komprese dat není k dispozici pro data uložená samostatně.

  • Tabulky implementované ve formátu vardecimal storage v SYSTÉMU SQL Server 2005 (9.x) zachovají toto nastavení při upgradu. Kompresi řádků můžete použít u tabulky, která má formát vardecimal storage. Vzhledem k tomu, že komprese řádků je nadmnožinou formátu vardecimálního úložiště, není důvod zachovat formát vardecimálního úložiště. Desetinné hodnoty nezískají žádnou další kompresi, když kombinujete formát úložiště vardecimal s kompresí řádků. Kompresi stránky můžete použít u tabulky, která má formát vardecimal storage; Sloupce formátu úložiště vardecimal však pravděpodobně nedosáhnou další komprese.

    Poznámka:

    Všechny podporované verze SQL Serveru podporují formát vardecimal storage; Vzhledem k tomu, že komprese dat dosahuje stejných cílů, je formát úložiště vardecimal zastaralý. Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají.

Seznam funkcí podporovaných edicemi SQL Serveru ve Windows najdete tady:

Komprese columnstore a archivu columnstore

Tabulky a indexy ve sloupcovém úložišti jsou vždy ukládány s kompresí columnstore. Velikost dat columnstore můžete dále zmenšit tak, že nakonfigurujete další kompresi s názvem archivální komprese. Aby bylo možné provést archivaci, SQL Server spustí na datech algoritmus komprese Microsoft XPRESS. Přidejte nebo odeberte archivní kompresi pomocí následujících typů komprese dat:

  • Použijte COLUMNSTORE_ARCHIVE kompresi dat ke kompresi columnstore dat pomocí archivační komprese.
  • Při použití COLUMNSTORE komprese dat slouží k dekomprimaci archivně komprimovaných dat. Výsledná data se budou dál komprimovat pomocí komprese columnstore.

Chcete-li přidat archivní kompresi, použijte alter TABLE (Transact-SQL) nebo ALTER INDEX (Transact-SQL) s REBUILD možností a DATA COMPRESSION = COLUMNSTORE_ARCHIVE.

Například:

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)
);

Chcete-li odebrat archivní kompresi a obnovit data na kompresi sloupcového úložiště, použijte příkaz ALTER TABLE (Transact-SQL) nebo ALTER INDEX (Transact-SQL) s REBUILD možností a DATA COMPRESSION = COLUMNSTORE.

Například:

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)
);

V dalším příkladu nastavíte kompresi dat na columnstore v některých oddílech a na archiv columnstore v jiných oddílech.

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE
        ON PARTITIONS (4, 5),
    DATA COMPRESSION = COLUMNSTORE_ARCHIVE
        ON PARTITIONS (1, 2, 3)
);

Výkon

Když komprimujete indexy columnstore s archivační kompresí, způsobí to, že index bude pomalejší než indexy columnstore, které nemají archivní kompresi. Použijte archivní komprimaci pouze tehdy, když si můžete dovolit použít další čas a prostředky procesoru ke komprimaci a načtení dat.

Výhodou archivace je snížení úložiště, což je užitečné pro data, která nejsou často přístupná. Pokud máte například oddíl pro každý měsíc dat a většina aktivit je za poslední měsíce, můžete archivovat starší měsíce, abyste snížili požadavky na úložiště.

Metadatové informace

Následující systémová zobrazení obsahují informace o kompresi dat pro clusterované indexy:

Postup sp_estimate_data_compression_savings (Transact-SQL) se může použít také u indexů columnstore.

Dopad na dělené tabulky a indexy

Při použití komprese dat s dělenými tabulkami a indexy mějte na paměti následující aspekty:

  • Pokud jsou oddíly rozděleny pomocí ALTER PARTITION příkazu, oba oddíly dědí atribut komprese dat původního oddílu.

  • Při sloučení dvou oddílů zdědí výsledný oddíl atribut komprese dat cílového oddílu.

  • Pokud chcete přepnout oddíl, musí vlastnost komprese dat oddílu odpovídat vlastnosti komprese tabulky.

  • K úpravě komprese dělené tabulky nebo indexu můžete použít dvě varianty syntaxe:

    • Následující syntaxe znovu sestaví pouze odkazovaný oddíl:

      ALTER TABLE <table_name>
      REBUILD PARTITION = 1 WITH (
          DATA_COMPRESSION = <option>
      );
      
    • Následující syntaxe znovu sestaví celou tabulku pomocí existujícího nastavení komprese pro všechny oddíly, na které se neodkazují:

      ALTER TABLE <table_name>
      REBUILD PARTITION = ALL WITH (
          DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),
          ...
      );
      

    Dělené indexy se řídí stejným principem použití ALTER INDEX.

  • Když je odstraněn clusterovaný index, odpovídající oddíly haldy si ponechávají svoje nastavení komprese dat, pokud nedojde ke změně schématu dělení. Pokud se schéma dělení změní, všechny oddíly se znovu sestaví do nekomprimovaného stavu. K vyřazení clusterovaného indexu a změně schématu dělení je potřeba provést následující kroky:

    1. Zahoďte clusterovaný index.
    2. Upravte tabulku pomocí ALTER TABLE ... REBUILD možnosti, která určuje možnost komprese.

    Pokud chcete clusterovaný index OFFLINE odstranit, je rychlá operace, protože se odeberou jenom horní úrovně clusterovaných indexů. Při vyřazení ONLINEclusterovaného indexu musí SQL Server znovu sestavit haldu dvakrát, jednou pro krok 1 a jednou pro krok 2.

Vliv komprese na replikaci

Při použití komprese dat s replikací mějte na paměti následující aspekty:

  • Když agent snímku vygeneruje počáteční skript schématu, použije nové schéma stejné nastavení komprese pro tabulku i její indexy. Kompresi nejde povolit jenom v tabulce a ne v indexu.

  • Pro transakční replikaci určuje možnost schématu článku, které závislé objekty a vlastnosti musí být skriptovány. Další informace najdete v tématu sp_addarticle.

    Distribuční agent při použití skriptů nekontroluje předplatitele nižší úrovně. Pokud je vybrána replikace komprese, vytvoření tabulky pro předplatitele nižší úrovně selže. U smíšené topologie nepovolujte replikaci komprese.

  • Při slučovací replikaci přepíše úroveň kompatibility publikace možnosti schématu a určuje objekty schématu, které jsou skriptovány.

    U smíšené topologie, pokud není nutné podporovat nové možnosti komprese, úroveň kompatibility publikace by měla být nastavena na verzi odběratele nižší úrovně. Pokud je to potřeba, komprimujte tabulky pro odběratele po jejich vytvoření.

Následující tabulka ukazuje nastavení replikace, která řídí kompresi během replikace.

Záměr uživatele Replikovat schéma oddílů pro tabulku nebo index Replikace nastavení komprese Skriptovací chování
Chcete-li replikovat schéma oddílů a povolit kompresi na oddílu u odběratele. Pravdivé Pravdivé Skriptuje schéma oddílů i nastavení komprese.
Pokud chcete replikovat schéma oddílů, ale ne komprimovat data odběratele. Pravdivé Nepravda Skriptuje schéma oddílů, ale ne nastavení komprese oddílu.
Nereplikujte schéma oddílů a nekomprimujte data odběratele. Nepravda Nepravda Nepodporuje skriptování nastavení oddílu ani komprese.
Pokud chcete zkomprimovat tabulku odběratele, pokud jsou všechny oddíly v Publisheru komprimované, ale nereplikují schéma oddílů. Nepravda Pravdivé Zkontroluje, jestli jsou pro kompresi povoleny všechny oddíly.

Skripty zakazují kompresi na úrovni tabulky.

Vliv na ostatní součásti SQL Serveru

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Komprese probíhá v databázovém stroji a data jsou prezentována většině ostatních komponent SQL Serveru v nekomprimované stavu. Tím se omezí účinky komprese na ostatní komponenty na následující faktory:

  • Operace hromadného importu a exportu
    • Při exportu dat i v nativním formátu jsou data výstupem v nekomprimované podobě řádku. To může způsobit, že velikost exportovaného datového souboru bude výrazně větší než zdrojová data.
    • Pokud je při importu dat povolena komprese cílové tabulky, databázový stroj převede data do komprimovaného formátu řádku. To může způsobit zvýšené využití procesoru v porovnání s importem dat do nekomprimované tabulky.
    • Při hromadném importu dat do haldy s kompresí stránky se operace hromadného importu pokusí komprimovat data pomocí komprese stránky při vložení dat.
  • Komprese nemá vliv na zálohování a obnovení.
  • Komprese nemá vliv na přenášení protokolů.
  • Komprese dat není kompatibilní se řídkými sloupci. Tabulky obsahující řídké sloupce se proto nedají komprimovat ani řídké sloupce přidávat do komprimované tabulky.
  • Povolení komprese může způsobit, že se plány dotazů změní, protože data se ukládají pomocí jiného počtu stránek a počtu řádků na stránku.