Articles

komprimering i SQL Server: komprimera och dekomprimera

Posted by admin

på Twitter nyligen frågade jag:

är det någon jag känner som använder funktionerna COMPRESS och DECOMPRESS i T-SQL?

till dem som svarade jakande frågade jag:

Vad fick dig att bestämma om detta i motsats till ROW eller PAGE komprimering?

Joey D ’ Antoni (blogg | Twitter), en av mina medförfattare, påminde mig om att rad-och sidkomprimering inte fungerar på LOB-data (”stort objekt”). Dave Dustin (Twitter) och Niko Neugebauer (blogg | Twitter) sa att de specifikt använder COMPRESS för LOB-data av denna anledning.

kodändringar

använda dessa funktioner kräver ändringar av befintlig kod eftersom du måste använda funktionen COMPRESS när du infogar data. Dave och Niko gjorde det genom att dölja funktionaliteten inuti vyer.

om du inte kan göra kodändringar i din miljö kan du behöva tillgripa rad-och sidkomprimering eller eventuellt kolumnstore-index.

hur fungerar det?

släppt med SQL Server 2016, COMPRESS utnyttjar gzip-komprimeringsalgoritmen med öppen källkod och kan minska utrymmet som används med så mycket som 90% beroende på vilken typ av data i fråga. Data lagras som datatypen VARBINARY(MAX) :

INSERT INTO dbo.Table1 (Col1, Col2) VALUES ('C0001', COMPRESS('<long string goes here>'));

DECOMPRESS används för att läsa data ut igen:

SELECT Col1, DECOMPRESS(Col2) AS Col2 FROM dbo.Table1 WHERE Col1 = 'C0001';

var skulle jag använda den?

detta är bra för att hålla reda på LOB-data som inte behöver frågas ofta, till exempel stora strängar som innehåller JSON och XML-text. Som nämnts i ett tidigare inlägg kanske XML-datatypen inte är lämplig för granskningsändamål eftersom den permanent ändrar data, medan COMPRESS skulle vara en lämplig lagringsmekanism eftersom data är exakt samma när de läses upp igen.

finns det några begränsningar?

du kan inte indexera komprimerade data eftersom de lagras som en komprimerad byte-array. Om du vill skapa ett index kan du antingen använda rad-eller sidkomprimering och hoppas på det bästa, eller använda en beräknad kolumn som innehåller de data du behöver från kolumnen och indexera det istället.

Related Post

Leave A Comment