Gäller:
Oracle Database – 12.1.0.2
Författare:
Mahesh Reddy M
Inledning:
Med Oracle Database 12c In-Memory får en enskild databas nu effektivt stöd för blandad arbetsbelastning och levererar optimala prestanda för överföringar samtidigt som den har stöd för analyser och rapportering i realtid. Med In-Memory aktiveras både DataMart- och informationslager för mer ändamålsenliga analyser, vilket ger slutanvändaren möjligheten att ställa flera företagsdrivande frågor på samma tid som det tar att bara ställa en. Med den här funktionen kan du spara kolumner, tabeller, partitioner och materialiserade vyer i minnet i kolumnformat, snarare än det typiska radformatet. In-Memory-kolumnlagring (IM Column Store) var den huvudsakliga funktionen i 12.1.0.2-korrigeringsuppsättningen.
Oracle Database 12c In-Memory-arkitektur:
Traditionellt lagras data endast i ROW-format, medan In-Memory-databasen lagrar data endast i kolumnformat. Därför har Oracle Database 12c stöd för dubbel formatarktitektur.
- När data begärs för åtgärder som inte är skrivskyddade (datamanipulering) laddas dessa data i traditionell Row Store (buffertcache)
- När data begärs för skrivskyddade åtgärder fylls de i i en ny In-Memory-kolumnlagring. Detta innefattar givetvis en omvandling av rad- till kolumnformat.
- När en överföring som innefattar inmatningar, uppdateringar eller borttagningar görs visas nya data omedelbart och samtidigt i både radlagringen och In-Memory-kolumnlagringen. Därför är båda lagringarna transaktionellt konsekventa
In-Memory-kolumnlagringen:
Database In-Memory använder en In-Memory-kolumnlagring som är en ny komponent i System Global Area (SGA), kallat In-Memory Area. Data i IM-kolumnlagring finns inte i det traditionella radformatet, utan använder istället ett nytt kolumnformat. IM-kolumnlagringen ersätter inte buffertcache, utan fungerar som ett tillägg, så att data nu kan lagras i minnet i både rad- och kolumnformat
In-Memory Area är en statisk pool i SGA, vars storlek kontrolleras av initieringsparametern INMEMORY_SIZE (standard 0). Den aktuella storleken på In-Memory Area visas i V$SGA
IM-kolumnlagring underordnas i två pooler:
- 1 MB pool – lagrar kolumnformaterade data
- 64 K pool – lagrar metadata om objekten.
Vi kan se det tillgängliga minnet som är tillgängligt i varje pool med följande fråga
SQL> välj * i 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 |
Tabell 1: tillgängligt minne i varje pool
Aktivera IM-kolumnlagring:
Som statisk pool träder ändringar i INMEMORY_SIZE-parametern inte i kraft förrän databasinstansen startas om. Detta påverkas eller kontrolleras inte heller av Automatic Memory Management (AMM). In-Memory Area måste ha en storlek på minst 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-instansen startas.
Totalt System Global Area 4.2950E+11 byte
Fast storlek 7 677 400 byte
Variabel storlek 2,0938E+10 byte
Databasbuffert 8,5899E+10 byte
Redo-buffert 529 190 912 byte
In-memory Area 3,2212 E + 11 byte
Databas har monterats.
Database har öppnats.
Vi kan se In-Memory-inställningar med följande fråga
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
procent
optimizer_inmemory_aware boolean TRUE
Vi kan också konfigurera parametrar för inmemory_size på CDB- och PDB-nivå. Om du konfigurerar parametrar på PDB-nivå behöver instansen eller PDB inte startas om. Summan av alla PDB-värden är mindre än lika med CDB-värde.
Vi kan aktivera och inaktivera In-Memory-alternativ på PDB-nivå, så som visas nedan
Anslut till PDB och utför sedan nedan kommando
Inaktivera:
Ändra konfiguration för systeminställning inmemory_size=0; eller
Ändra återställning för systeminställningen inmemory_size;
Aktivera:
Ändra konfiguration för systeminställning set inmemory_size=20G;
Prioriteringsnivåer för In-Memory:
IM-kolumnlagring ska fyllas i med de mest prestandakritiska data i databasen. Mindre prestandakritiska data kan finnas i flashminne eller på disken med lägre kostnad. Om databasen är tillräckligt liten kan du givetvis fylla i alla tabeller i IM-kolumnlagringen. Databasens In-Memory lägger till ett nytt INMEMORY-attribut för tabeller och materialiserade vyer.
Vi kan aktivera INMEMORY-attribut på
Tabellutrymme, tabell, (under-)partition och materialiserad vy.
Om du aktiverar det här attributet på lagringsplatsnivå aktiveras alla tabeller och materialiserade vyer i lagringsplatsnivån som standard för IMCOLUMN-lagring.
ändra lagringsplatsuppgift INMEMORY;
om du aktiverar det här attributet på lagringsplatsnivå innebär det att alla tabellens kolumner ska fyllas i i IMCOLUMN-lagringen. Det är dock möjligt att endast fylla i underuppsättning i kolumner i IMCOLUMN-lagring.
Ändra table quest_tab INMEMORY NO Inmemory (EMP);
På liknande vis för uppdelad tabell
Ändra table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Bakgrundsprocesser:
IMCO: IMCO-bakgrundsprocessen initierar ifyllning (förifyllning) av In-Memory-aktiverade objekt med prioritering LOW/MEDIUM/HIGH/CRITICAL.
SMCO: SMCO skapar slavprocesser dynamiskt (Wnnn) för att implementera uppgifterna.
Wnnn: Wnnn-processer utför ifyllning och ifyllning en gång till för In-Memory-uppgifter för ifyllning eller ifyllning en gång till av In-Memory-aktiverade objekt.
Objekt fylls i i IM-kolumnlagringen antingen i en prioriterad lista direkt efter att databasen öppnas eller efter att de skannats (efterfrågats) första gången. Den ordning som objekt fylls i kontrolleras av NYCKELORDSPRIORITET, som har fem nivåer. Standardprioritet är INGEN, vilket innebär att objekt fylls i efter att de skannats första gången
Olika prioriteringsnivåer kontrolleras av delsatsen PRIORITET i delsatsen INMEMORY
Priority Level Description
CRITICAL Objekt fylls i omedelbart efter att databasen öppnas
HIGH Objekt fylls i efter att alla CRITICAL-objekt har fyllts i
MEDIUM Objekt fylls i efter att alla CRITICAL- och HIGH-objekt har fyllts i
LOW Objekt fylls i efter att alla CRITICAL-, HIGH och MEDIUM-objekt har fyllts i
NONE Objekt fylls endast i efter att de skannats första gången (standard)
Objekt som är mindre än 64 KB fylls inte i i minnet, eftersom de tar upp en stor del av utrymmet i IM-kolumnlagringen eftersom minnet allokeras delar om 1 MB.
T.ex: ändra tabelluppgift med kritisk In-Memory-prioritet;
In-Memory-komprimeringsteknik:
IM-kolumnlagring använder särskilda komprimeringsformat som är optimerade för åtkomsthastighet snarare än minskning av utrymme. Databasen ökar hastigheten på följande sätt:
- Med komprimeringsformat kan databasen minska andelen minne som bearbetas för vardera kolumn. SQL utförs direkt på de komprimerade kolumnerna.
- Databasen använder instruktioner för SIMD-vektor (uppsättning) för att bearbeta uppsättningar av kolumnvärden som en enda CPU-klockcykel. Databasen kan lagra många olika värden i en vektor, vilket maximerar prestandafördelarna med SIMD-vektorbearbetning.
In-Memory-komprimering specificeras med nyckelordet MEMCOMPRESS, en delsats i INMEMORY-attributet. Det finns sex nivåer, där alla tillhandahåller olika nivåer av komprimering och prestanda.
No Memcompress: data fylls i i In-Memory utan komprimering.
Memcompress for DML: huvudsakligen för DML-prestanda och minimal komprimering.
Memcompress for Query Low: optimerat för Query-prestanda (standard).
Memcompress for Query High: optimerat för Query-prestanda och också utrymmesbesparande
Memcompress for Capacity Low: mer utrymmesbesparande jämfört med Query High och Low
Memcompress for Capacity High: optimerat för utrymmesbesparande och lite mindre prestanda.
Komprimeringsförhållanden kan variera från 2 x till 20 x, beroende på komprimeringsalternativ, datatyp och tabellinnehåll som har valts.
T.ex.: ändra tabelluppgift för In-Memory – Memcompress for Query High;
In-Memory-kolumnlagring på RAC:
I klustermiljön har varje nod egen kolumnlagring. Varje nod i klustret ska ha samma storlek för IM-kolumnlagring. Som standard distribueras alla objekt som fylls i minnet över alla IM-kolumnlagring i klustret. Distribution av objekt över IM-kolumnlagringar i ett kluster kontrolleras av två ytterligare delsatser i INMEMORY-attributet: DISTRIBUTE och DUPLICATE (endast tekniska system).
Distribution:
Objekten som är distribuerade över kluster kontrolleras av distribuerade delsatser. Du kan distribuera objekten på följande sätt
Distribuera genom radhantering – distribuera objekten genom rader till olika noder
Distribuera genom partition – distribuera partitioner till noder inom klustret
Distribuera genom delsatser – distribuera delpartitionen till olika noder.
T.ex: ändra tabelluppgift med distribution genom partition;
Här är det viktigt att uttrycka att Oracle In-Memory RAC är en
Shared-Nothing-arkitektur för frågor. Dvs. att om du ställer en fråga gentemot In-Memory-data objekt (anta att objekt distribueras i två IM-kolumnlagringar), endast har åtkomst till data som finns i tillhörighetsnoden, så innebär det att IMCU:er (Inmemory Compression Units) mellan instanser i klustret inte delas.
Du kan konfigurera
grader av parallellism (DOP) till AUTO. Den parallella frågekoordinatorn identifierar andra instanser av IMCU-platsen. Om du inte kan konfigurera DOP till AUTO använder inte den parallella frågekoordinatorn de andra IMCU-instanserna.
konfigurera grader av parallellism till auto
ändra systemkonfiguration parallel_degree_policy=AUTO scope=both sid='*';
Dubblett:
Öka tillgängligheten genom att kopiera objekt över alla instanser. Du kan använda den duplicerade delsatsen för att specificera att In-Memory-tabellen lagras i alla instanser inom klustret. För icke-tekniska system fungerar inte det här alternativet.
Ex. ändra tabelluppgift i In-Memory, duplicera alla;
tabelluppgift lagras i alla instansen.
Övervaka In-memory-objekt:
För övervakning av In-Memory-objekt introducerar Oracle två nya V$views som är
v$IM_SEGMENTS eller v$IM_USER_SEGMENTS och v$IM_COLUMN_LEVEL.
Med de här vyerna kan vi ta reda på hur många objekt som för närvarande finns i IMCOLUMN-lagringen.
EX:
konfigurera linesize 256
konfigurera pagesize 999
välj 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
från V$IM_SEGMENTS
grupp efter ägare, segment_name
ordna efter 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
EX:
konfigurera linesize 256
konfigurera pagesize 999
konfigurera verifiering av
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
I exemplet ovan kan du notera att två av tabellerna ovan – kund och leverantör – inte har ett värde för kolumnen INMEMORY. INMEMORY-attributet är ett attribut på segmentnivå. Både kund och leverantör är uppdelade tabeller och logiska objekt. INMEMORY-attribut för dessa tabeller registreras på partitions- eller delpartitionsnivå i *_TAB_ (SUB) PARTITIONS.
Tre ytterligare kolumner – INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE och INMEMORY_COMPRESSION – har också lagts till i *_TABLES-vyerna för att visa aktuella InMemory-attribut för vardera tabell.