on Twitter recently, I asked:
käyttääkö kukaan tuntemani
COMPRESS
jaDECOMPRESS
ominaisuuksia T-SQL: ssä?
niille, jotka vastasivat myöntävästi, kysyin:
mikä sai sinut päättämään tämän sijaan
ROW
taiPAGE
Pakkaus?
Joey D ’ Antoni (blogi | Twitter), yksi kirjoittajistani, muistutti, että rivi-ja sivupakkaukset eivät toimi LOB (”large object”) – tiedoilla. Dave Dustin (Twitter) ja Niko Neugebauer (blogi | Twitter) kertoivat käyttävänsä tästä syystä nimenomaan COMPRESS
LOB-tietoihin.
koodin muutokset
näiden funktioiden käyttäminen edellyttää muutoksia olemassa olevaan koodiin, koska sinun on käytettävä COMPRESS
– funktiota tietojen lisäämisessä. Dave ja Niko tekivät sen salaamalla toiminnallisuuden näkymien sisällä.
jos et voi tehdä koodimuutoksia ympäristöösi, saatat joutua turvautumaan rivi-ja sivukompressioon tai mahdollisesti kolumnstore-indekseihin.
miten se vaikuttaa?
julkaistu SQL Server 2016: n kanssa, COMPRESS
hyödyntää avoimen lähdekoodin gzip-pakkausalgoritmia ja voi vähentää käytettävää tilaa jopa 90% riippuen siitä, millaisesta datasta on kyse. Tiedot tallennetaan VARBINARY(MAX)
tietotyyppinä:
INSERT INTO dbo.Table1 (Col1, Col2) VALUES ('C0001', COMPRESS('<long string goes here>'));
DECOMPRESS
käytetään lukemaan tiedot uudelleen:
SELECT Col1, DECOMPRESS(Col2) AS Col2 FROM dbo.Table1 WHERE Col1 = 'C0001';
missä käyttäisin sitä?
tämä on hyvä pitää kirjaa LOB-tiedoista, joita ei tarvitse kysellä usein, esimerkiksi suurista merkkijonoista, jotka sisältävät JSON-ja XML-tekstiä. Kuten aiemmassa viestissä todettiin, XML – tietotyyppi ei välttämättä sovellu tarkastustarkoituksiin, koska se muuttaa tietoja pysyvästi, kun taas COMPRESS
olisi sopiva tallennusmekanismi, koska tiedot ovat täsmälleen samat, kun ne luetaan uudelleen.
onko rajoituksia?
pakattua dataa ei voi indeksoida, koska se on tallennettu pakattuna tavujoukkona. Jos haluat luoda indeksin, voit joko käyttää rivin tai sivun pakkausta ja toivoa parasta, tai käyttää laskettua saraketta, joka sisältää tarvittavat tiedot sarakkeesta, ja indeksoida sen sijaan.