úterý 11. září 2007

Datová komprese aneb jak ušetřit diskový prostor a zrychlit odezvu dotazů

Už jste přemýšleli o tom, co uděláte s historickými daty staršími než je povinná doba pro jejich uchování a které určitě zabírají více jak 50 procent diskové kapacity serveru?
Budete je archivovat? Ale jakým způsobem a kam? Budou pak snadno a rychle dostupná pro účely reportingu, analýz, auditu nebo jiných činností, které „business“ potřebuje?

Zkuste se zamyslet zda není jednodušší je nechat tam kde jsou a využít „Table Compression“ – vlastnost databáze Oracle, která je k dispozici již od verze 9i.


Co je a jak funguje Oracle Table Compression


Jde o bezztrátovou kompresi, která je prováděna mezi hodnotami řádků a sloupců na úrovni databázového bloku eliminací duplicitních hodnot. Struktura komprimovaného bloku oproti normálnímu je jiná v tom, že je zde navíc přidána takzvaná „Symbol Table“ (metadata o kompresi), která obsahuje nejčastěji se opakující hodnoty. To zda pro sloupce budou hodnoty do „Symbol Table“ přidány nebo ne, rozhoduje sama databáze a to na základě délky sloupce a počtu výskytů hodnot. Jakmile je hodnota do „Symbol Table“ vložena, je její normální výskyt v bloku nahrazen „pointerem“ ukazujícím do „Symbol Table“, viz. Obr.1.

Obr.1 – Struktura komprimovaného a normálního bloku

Table Compression významně snižuje požadavky na použitý diskový prostor a na paměť databáze Oracle (konkrétně na buffer cache), a přitom zvyšuje výkon SQL dotazů. Ptáte se jak je to možné?

Data komprimovaných tabulek zabírají méně datových bloků na disku (do jednoho bloku je nyní možné uložit mnohem více dat), čímž se snižují nároky na diskový prostor. Data z komprimovaných tabulek jsou čtena do paměti databáze (buffer cache) v komprimovaném stavu (jsou dekomprimovány až při přístupu do nich), z čehož vyplývá, že do stejně velké paměti lze načíst mnohem více dat. A protože díky kompresi se čte méně databázových bloků z disku, provádí se i méně I/O operací (fyzických i logických), což má za následek, že dotazy „trpící“ díky vysokému I/O jsou nyní znatelně rychlejší.


Jak se Table Compression zapíná

Table Compression můžete využít na tabulky, materializované pohledy nebo partition (všechny nebo pouze určité). Atribut komprese lze pak zapnout i pro celý tablespace tzn. všechny výše zmíněné objekty budou mít zapnutou kompresi.

CREATE TABLE [name] COMPRESS;


Kdy a jaké operace data komprimují


V Oracle Database 9i a 10g bylo možno komprimovat pouze ta data, která byla nahrávána pomocí „BULK“ operací
. Data, která byla nahrávána nebo modifikována pomocí DML (insert, update, delete) komprimována nebyla.
Tzn. využít Table Compression bylo nejvhodnější pro datové sklady a nebo pro archivaci historických dat (tedy tam, kde lze využít „BULK“ operace).

Mezi „BULK“ operace, které komprimují data patří:
  • CREATE TABLE [name] COMPRESS AS SELECT
  • ALTER TABLE [name] MOVE COMPRESS
  • ALTER TABLE [name] MOVE PARTITION [name] COMPRESS
  • INSERT /*+ APPEND */ nebo Parallel INSERT do tabulky, která má zapnutou kompresi
  • Direct Path SQL*Loader do tabulky, která má zapnutou kompresi

V Oracle Database 11g je k dispozici OLTP Table Compression, která podporuje kompresi dat i pro individuální DML operace, tedy INSERT, UPDATE, DELETE. V tomto případě komprese probíhá na pozadí (nulová režie při zápisu) a to jakmile zaplnění databázového bloku daty dosáhne hodnotu parametru PCTFREE, viz. Obr.2.

Syntaxe v 11g je následující:
  • ... COMPRESS [FOR {ALL | DIRECT_LOAD} OPERATIONS]
  • kde parametr DIRECT_LOAD – (default nastavení), je to samé co je v 9i a 10g
  • kde parametr ALL – DML i DIRECT_LOAD operace

Obr.2 – OLTP Table Compression v Oracle Database 11g


Testcase – co vlastně testovat?

Co udělat před vlastním nasazením? Nejlépe je otestovat Table Compression na kopii vašich skutečných dat a s vašimi konkrétními aplikacemi. Na co se vlastně zaměřit?

  1. Kolik místa kompresí dat vlastně ušetříte, tzn. zjistit kompresní poměr (nekomprimovaná / komprimovaná data). Ten standardně bývá okolo 2:1 až 4:1 a samozřejmě závisí na samotných datech. U hodně duplicitních dat, jako jsou například detailní výpisy hovorů u telekomunikačního operátora, je možné dosáhnout poměru až 12:1 (nekomprimovaná data jsou 12 krát větší než komprimovaná).

  2. Co to udělá s aplikací / reportingem, který data z tabulky využívá. Samozřejmostí je, že Table Compression je pro veškeré aplikace, reporty nebo uživatele plně transparentní, tedy pro nikoho se nic nezmění. Ale musíte si být jisti, že odezva aplikace/reportu je stejná jako dříve nebo lepší.

Osobně jsem Table Compression testoval ještě ve verzi 9i (Linux RedHat, Oracle9i EE – 9.2.0.2.0) nad daty, která byla uložena v partitionované tabulce. Z výsledků jsem byl mile překvapen. Dosáhl jsem kompresního poměru okolo 2:1, tzn. ušetřil 50 procent místa a navíc, což je podstatnější, veškerý reporting se nad těmito daty několikanásobně zrychlil, viz. Obr.3 a 4.

Obr.3 – Kompresní poměr


Obr.4 – Porovnání výkonnosti nekomprimovaná vs. komprimovaná data (zátěž CPU, doba zpracování, fyzické a logické I/O operace generované dotazy Q1, Q2 a Q3)


Co dodat závěrem

Oracle Table Compression patří mezi významné vlastnosti databáze Oracle
. Nejen že Vám ušetří diskovou kapacitu, ale v případě systémů s pomalým nebo hodně zatíženým I/O markantně urychlí odezvu dotazů.

Oracle Database 11g navíc přináší Advanced Compression Option, která kromě již zmíněné OLTP Table Compression obsahuje navíc: Data Guard Network Compression, Data Pump Compression, Fast RMAN Compression, SecureFiles Compression and Deduplication. Ale o tom až jindy.




Erik Eckhardt (eec).

3 komentáře:

AA řekl(a)...

Zkusmo jsem to testoval a je to super:

Nekomprimovaná data: Odezva=16s / Velikost = 216M

Komprimovaná data: Odezva=4s / Velikost = 88M

Anonymní řekl(a)...

Jak se dá změřit ta latence dotazu? díky

BI.DW.CZ řekl(a)...

I. varianta
1. spustte SQLPlus
2. set timing on (vraci dobu behu dotazu)
3. set autotrace on (vraci execution plan a statistiky)
4. vlozte vas dotaz

II. varianta
1. spustte SQLPlus
2. alter system set timed_statistics = true; (bude sbirat casy pro statistiky)
3. alter session set sql_trace = true; (zacne tracovat vasi sessions)
4. vlozte vas dotaz
5. alter session set sql_trace = false; (vypne tracovani vasi session)
6. na disku v USER_DUMP_DEST najdete svuj trace
7. pouzijte utilitu tkprof na vas trace a dostanete casy cpu, io, doby behu a dalsi.

Erik.