Platí pro:
Databáze Oracle – 12.1.0.2
Autor:
Mahesh Reddy M
Úvod:
Díky zavedení sady databáze Oracle 12c In-Memory může nyní jedna databáze efektivně podporovat smíšená pracovní zatížení, poskytovat optimální výkon pro transakce a současně podporovat analýzu a hlášení v reálném čase. Sada In-Memory umožňuje datovým tržištím a skladům poskytovat více ad-hoc analytiky, a umožňuje tak koncovým uživatelům pokládat několik obchodních dotazů za stejnou dobu, jakou nyní trvá položit pouze jeden dotaz. Díky těmto funkcím můžete v paměti ukládat sloupce, tabulky, oddíly a materializovaná zobrazení ve formátu sloupců, nikoli v typickém formátu řádku. Úložiště sloupců In-Memory (úložiště sloupců IM) je hlavní funkcí sady oprav 12.1.0.2.
Architektura databáze Oracle 12c In-Memory:
Data se tradičně ukládají pouze ve formátu řádků, kdežto data databáze In-Memory se ukládají pouze ve formátu sloupců. Takže databáze Oracle 12c podporuje architekturu ve dvou formátech.
- Kdykoli jsou data vyžádána pro operace čtení/zápisu (manipulace s daty), načtou se do tradičního úložiště řádků (mezipaměť vyrovnávací paměti).
- Kdykoli jsou data vyžádána pro operace určené pouze ke čtení, importují se do nového úložiště sloupců In-Memory. Tento import samozřejmě zahrnuje transformaci z formátu řádku na formát sloupce.
- Pokaždé, když se potvrdí transakce zahrnující vložení, aktualizace nebo odstranění, nová data se okamžitě zobrazí v úložišti řádků i v úložišti sloupců In-Memory. Z tohoto důvodu jsou obě úložiště transakčně konzistentní.
Úložiště sloupců In-Memory:
Databáze In-Memory používá úložiště sloupců In-Memory, které je novou součástí oblasti SGA (System Global Area), nazývané oblastí In-Memory. Data ve sloupci IM se neukládají v tradičním formátu řádku, nýbrž v novém formátu sloupce. Úložiště sloupců IM nenahrazuje vyrovnávací paměť, slouží spíš jako doplněk, takže data lze nyní ukládat do paměti ve formátech řádku i sloupce.
Oblast In-Memory je statický fond v rámci oblasti SGA, jejíž velikost se řídí parametrem inicializace INMEMORY_SIZE (výchozí hodnota je 0). Aktuální velikost oblasti In-Memory je viditelná v části V$SGA.
Úložiště sloupců IM je rozděleno do dvou fondů:
- 1MB fond – Ukládá samotná data ve formátu sloupce.
- 64k fond – Ukládá metadata o objektech.
Pomocí níže uvedeného dotazu můžeme zobrazit dostupné množství paměti v každém fondu.
SQL> select * from v$inmemory_area;
POOL |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
1 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
1 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
2. |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
2. |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
3 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
3 |
Tabulka 1: Paměť dostupná v každém fondu
Povolení úložiště sloupců IM:
Jelikož se jedná o statický fond, nebudou platné žádné provedené změny parametru INMEMORY_SIZE, dokud nerestartujete instanci databáze. Rovněž fond neovlivňuje ani neřídí funkce AMM (Automatic Memory Management). Oblast In-Memory musí mít minimální velikost 100 MB.
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
ORACLE instance started.
Total System Global Area 4.2950E+11 bytes
Fixed Size 7677400 bytes
Variable Size 2.0938E+10 bytes
Database Buffers 8.5899E+10 bytes
Redo Buffers 529190912 bytes
In-Memory Area 3.2212E+11 bytes
Database mounted.
Database opened.
Pomocí níže uvedeného dotazu můžete zobrazit nastavení In-Memory:
SQL> SHOW PARAMETER INMEMORY
NAME TYPE VALUE
---------------------------------- ----------- -----
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 1
inmemory_query string ENABLE
inmemory_size biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
Parametr inmemory_size můžeme nastavit také na úrovni CDB a PDB. Pokud tento parametr nastavíte na úrovni PDB, není nutné restartovat instanci ani úroveň PDB. Součet všech hodnot PDB je stejný nebo menší než hodnota CDB.
Možnost In-Memory lze povolit nebo zakázat na níže uvedené úrovni PDB.
Připojte se k úrovni PDB a proveďte níže uvedený příkaz.
Deaktivace:
Alter system set inmemory_size=0; or
Alter system reset inmemory_size;
Aktivace:
Alter system set inmemory_size=20G;
Úrovně priority In-Memory:
Úložiště sloupců IM by mělo obsahovat nejdůležitější data v databázi. Méně důležitá data mohou být uložena na levnější jednotce flash nebo disku. Je-li databáze dostatečně malá, můžete všechny své tabulky samozřejmě importovat do úložiště sloupců IM. Databáze In-Memory přidává nový atribut INMEMORY pro tabulky a materializovaná zobrazení.
Atribut INMEMORY můžeme povolit
v tabulkovém prostoru, tabulce, (pod)oddílu a vyhodnoceném zobrazení.
Pokud tento atribut povolíte na úrovni tabulkového prostoru, budou ve výchozím nastavení pro úložiště IMCOLUMN povoleny všechny tabulky a materializovaná zobrazení v tabulkovém prostoru.
alter tablespace quest INMEMORY;
Pokud povolíte tento atribut na úrovni tabulky, všechny sloupce tabulky se importují do úložiště IMCOLUMN. Do úložiště IMCOLUMN je však možné importovat pouze podmnožinu sloupců.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
Podobné je to i v případě tabulek s oddíly.
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Procesy na pozadí:
IMCO: Proces na pozadí IMCO iniciuje importování (předběžné importování) priorit LOW/MEDIUM/HIGH/CRITICAL do objektů aktivovaných v oblasti In-Memory.
SMCO: Proces SMCO dynamicky vytváří podřízené procesy (Wnnn) za účelem implementace těchto úloh.
Wnnn: Proces Wnnn zpracovává úlohy importu a opětovného importu objektů aktivovaných v oblasti In-Memory.
Objekty se importují do úložiště sloupců IM buď do seznamu priorit ihned po otevření databáze, nebo po prvním skenování (dotazu). Pořadí, ve kterém se objekty vyplňují, řídí klíčový parametr PRIORITY, který má pět úrovní. Výchozí parametr PRIORITY je NONE, což znamená, že objekt se vyplní pouze po prvním skenování.
Různé úrovně priority řízené podklauzulí PRIORITY klauzule INMEMORY.
Popis úrovně priority
CRITICAL – Objekt se vyplní okamžitě po otevření databáze.
HIGH – Objekt se vyplní po vyplnění všech objektů CRITICAL.
MEDIUM – Objekt se vyplní po vyplnění všech objektů CRITICAL a HIGH.
LOW – Objekt se vyplní po vyplnění všech objektů CRITICAL, HIGH a MEDIUM.
NONE – Objekty se vyplní pouze po prvním skenování (výchozí nastavení).
Objekty menší než 64 kB se neimportují do paměti, protože by zabíraly značné místo úložiště sloupců IM. Paměť se totiž přiděluje po 1MB úsecích.
Např.: alter table quest inmemory priority critical;
Techniky komprese In-Memory:
Úložiště sloupců IM používá speciální formáty komprese optimalizované pro rychlost přístupu, nikoli pro snížení kapacity úložiště. Databáze zvyšuje rychlost následujícími způsoby:
- Formáty komprese umožňují databázi snížit množství zpracovávané paměti pro každý sloupec. SQL se provádí přímo v komprimovaných sloupcích.
- Databáze používá k zpracování pole hodnot sloupce v jednom pracovním cyklu procesoru vektor SIMD (pole). Databáze může do vektoru ukládat mnoho hodnot. Ten maximalizuje výhody výkonu pomocí vektorového zpracování SIMD.
Komprese In-Memory je specifikována pomocí klíčového parametru MEMCOMPRESS, podklauzule atributu INMEMORY. K dispozici je šest úrovní, z nichž každá poskytuje jinou úroveň komprese a výkonu.
No Memcompress: Data se importují do oblasti In-Memory bez komprese.
Memcompress for DML: Je určena hlavně pro výkon DML a minimální kompresi.
Memcompress for Query Low: Optimalizována pro výkon dotazu (výchozí nastavení).
Memcompress for Query High: Optimalizována pro výkon dotazu a také šetří místo.
Memcompress for Capacity Low: Více úspory místa v porovnání s Query high a low.
Memcompress for Capacity High: Optimalizovaná pro úsporu místa a o trochu menší výkon.
Poměry komprese se mohou v závislosti na vybrané volbě komprese, typu dat a obsahu tabulky lišit od 2X do 20X.
Např.: alter table quest inmemory memcompress for query high;
Úložiště sloupců In-Memory v řadiči RAC:
V prostředí clusteru má každý uzel vlastní úložiště sloupců. Každý uzel v clusteru by měl mít stejnou velikost jako úložiště sloupců IM. Ve výchozím nastavení budou všechny objekty importované do paměti distribuovány ve všech úložištích sloupců IM v clusteru. Distribuce objektů napříč úložišti sloupců IM v clusteru je řízena dvěma dalšími podklauzulemi v atributu INMEMORY: DISTRIBUTE a DUPLICATE (pouze určené systémy).
Distribute:
Distribuci objektů v rámci clusteru řídí podklauzule DISTRIBUTE. Objekty můžete distribuovat následujícími způsoby:
Distribute by rowed range – Distribuuje objekty podle řádků na různé uzly.
Distribute by Partition – Distribuuje oddíly do uzlů v rámci clusteru.
Distribute by sub partition – Distribuuje pododdíly do různých uzlů.
Např.: alter table quest inmemory distribute by partition;
Je důležité zmínit, že řadič Oracle In-Memory RAC je
architektura SN (shared-nothing) pro dotazy, tzn. pokud položíte dotaz na objekty dat In-Memory (předpokládá se, že objekty jsou rozložené do dvou úložišť sloupců IM), můžete získat přístup pouze k datům, která jsou uložena v uzlu afinity, takže nedochází ke sdílení jednotek IMCU (Inmemory Compression Units) napříč instancemi v clusteru.
Můžete tedy nastavit
stupeň paralelizace (DOP) na hodnotu AUTO. Koordinátor paralelních dotazů identifikuje další instance umístění IMCU. Pokud nemůžete nastavit DOP na hodnotu AUTO, paralelní koordinátor dotazů nebude používat jiné instance jednotek IMCU.
Nastavte stupeň paralelizace na hodnotu auto.
alter system set parallel_degree_policy=AUTO scope=both sid='*';
Duplicate:
Pro zvýšení dostupnosti se objekty kopírují do všech instancí. Podklauzule Duplicate se používá k tomu, aby se tabulka In-Memory uložila do všech instancí v clusteru. U systémů, které k tomu nejsou speciálně určeny, tato možnost nebude fungovat.
Např.: alter table quest inmemory duplicate all;
Tabulka Quest se uloží do všech instancí.
Monitorování objektů In-Memory:
Pro monitorování objektů In-Memory společnost Oracle představuje dvě nová zobrazení V$view:
v$IM_SEGMENTS či v$IM_USER_SEGMENTS a v$IM_COLUMN_LEVEL.
Pomocí těchto zobrazení můžeme zjistit, kolik objektů je aktuálně vloženo do úložiště IMCOLUMN.
Příklad:
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
Příklad:
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
Ve výše uvedeném příkladu si můžete všimnout, že dvě tabulky – Customer a Supplier – nemají hodnotu pro sloupec INMEMORY. Atribut INMEMORY je atribut na úrovni segmentu. Customer a Supplier jsou tabulky rozdělené do oddílů, a tím pádem i logické objekty. Atribut INMEMORY pro tyto tabulky se zaznamená na úrovni oddílu nebo pododdílu v části *_TAB_ (SUB) PARTITIONS.
Do zobrazení *_TABLES byly přidány tři další sloupce (INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE a INMEMORY_COMPRESSION), které označují aktuální atributy INMEMORY pro každou tabulku.