Při vytváření tabulky v SQL Serveru máte možnost použít kompresi dat.
Komprese dat pomáhá zmenšit velikost databáze. Může také pomoci zlepšit výkon I/O náročných pracovních zátěží, protože data jsou uložena na menším počtu stránek, čímž se sníží počet stránek, které dotazy potřebují ke čtení z disku.
K tomu použijte DATA_COMPRESSION
možnost při vytváření tabulky.
Příklad
Zde je příklad k demonstraci.
CREATE TABLE Movies (
MovieId int IDENTITY(1,1) PRIMARY KEY NOT NULL,
MovieName nvarchar(200)
)
WITH (DATA_COMPRESSION = ROW);
V tomto případě používám kompresi řádků.
Následující používá kompresi stránky.
CREATE TABLE Movies (
MovieId int IDENTITY(1,1) PRIMARY KEY NOT NULL,
MovieName nvarchar(200)
)
WITH (DATA_COMPRESSION = PAGE);
Jak odstranit kompresi
Kompresi můžete odstranit pomocí ALTER TABLE
pomocí příkazu NONE
znovu sestavit tabulku jako typ komprese.
ALTER TABLE MOVIES
REBUILD WITH (DATA_COMPRESSION = NONE);
Tabulky sloupců
Pokud používáte tabulky columnstore (tabulky uložené s seskupeným indexem columnstore), výše uvedené typy komprese neplatí. V tomto případě jsou možnosti komprese COLUMNSTORE
a COLUMNSTORE_ARCHIVE
.
Výsledky komprese se mohou lišit
Velikost komprese, kterou získáte, bude záviset na datech a typu komprese.
ROW
komprese například odstraní nepotřebné bajty z hodnot sloupců jejich uložením ve formátu s proměnnou délkou. PAGE
komprese na druhou stranu ukládá opakující se hodnoty pouze jednou na stránku a nastavuje ukazatel z příslušných sloupců na stránce.
Někdy můžete zjistit, že komprimací objektu se ne vždy sníží jeho velikost a v některých případech se může skutečně zvětšit jeho velikost.
K tomu může dojít, pokud vaše sloupce používají datový typ, který nemá prospěch z komprese.
Komprese řádků také snižuje režii metadat, ale v některých případech může být režie větší než u starého formátu úložiště.
Pokud vaše data nemají žádnou výhodu z komprese kvůli jejich datovému typu, pak je pravděpodobné, že režie způsobí spíše zvýšení požadavků na úložiště než snížení.
Ale rozdíly ve velikosti komprese budou také záviset na skutečných datech. Pokud máte například char(10) sloupec, komprese odstraní všechny koncové výplňové znaky. Máte-li mnoho řádků se znaky pro výplň na konci, měli byste dosáhnout lepšího výsledku, než když nemáte žádné (nebo jen málo) řádků se znaky pro výplň na konci.