Koskee seuraavia:
Oracle Database 12.1.0.2
Tekijä:
Mahesh Reddy M
Johdanto
Oracle Database 12c:n uuden In-Memory-ominaisuuden avulla yksittäinen tietokanta voi tukea tehokkaasti monenlaisia työkuormia tarjoamalla optimaalisen suorituskyvyn tietojen muokkaamiseen ja tukemalla samalla reaaliaikaista analytiikkaa ja raportointia. In-Memoryn avulla tietovarastot ja niiden osajoukot voivat tuottaa lisää ad-hoc-analytiikkaa, sillä loppukäyttäjät voivat tehdä useita yrityksen toimintaa ohjaavia kyselyjä samassa ajassa, joka kuluu nykyään yhteen kyselyyn. Ominaisuuden ansiosta sarakkeet, taulukot, osiot ja materialisoidut näkymät voi tallentaa muistiin tavallisen rivimuodon sijasta sarakemuodossa. In-Memory Column Store (IM-sarakevarasto) oli 12.1.0.2-korjaustiedostosarjan tärkein ominaisuus.
Oracle Database 12c:n In-Memory-arkkitehtuuri:
Tiedot tallennetaan perinteisesti ainoastaan rivimuotoon, kun taas In-Memory-tietokantaan ne tallennetaan ainoastaan sarakemuodossa. Oracle Database 12c tukee siis kaksimuotoista arkkitehtuuria.
- Kun tietoja pyydetään luku-/kirjoitustoimintoja (tietojen muokkaamista) varten, ne ladataan perinteiseen rivivarastoon (puskurivälimuistiin).
- Kun tietoja pyydetään pelkkää lukua varten, ne ladataan uuteen In-Memory-sarakevarastoon. Tiedot muunnetaan tietysti ladattaessa rivimuodosta sarakemuotoon.
- Kun tietokantaan tehdään lisäyksiä, päivityksiä tai poistoja sisältävä tapahtuma, uudet tiedot ilmestyvät välittömästi ja samanaikaisesti sekä rivivarastoon että In-Memory-sarakevarastoon. Näin molempien varastojen tapahtumat pysyvät yhdenmukaisina.
In-Memory-sarakevarasto:
Databasen In-Memory-ominaisuus käyttää In-Memory-sarakevarastoa, joka on SGA:n (System Global Area) uusi In-Memory Area -nimellä kutsuttava osa. IM-sarakevaraston tiedot eivät ole perinteisessä rivimuodossa, vaan se käyttää uutta sarakemuotoa. IM-sarakevarasto ei korvaa puskurivälimuistia, vaan täydentää sitä, jotta tiedot voidaan tallentaa muistiin sekä rivi- että sarakemuodossa.
In-Memory Area on SGA:han sisältyvä kiinteä varanto, jonka kokoa hallitaan alustusparametrilla INMEMORY_SIZE (oletus on 0). In-Memory Arean kokoa voi tarkastella V$SGA-näkymässä.
IM-sarakevarasto on jaettu kahteen eri varantoon:
- 1 Mt:n varanto: säilyttää varsinaiset sarakemuotoon tallennetut tiedot
- 64 Kt:n varanto: säilyttää kohteiden metatiedot.
Kunkin varannon käytettävissä olevan muistin voi selvittää seuraavalla kyselyllä:
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 |
Taulukko 1: Varantojen käytettävissä oleva muisti
IM-sarakevaraston käyttöönotto:
Koska kyseessä on kiinteä varanto, INMEMORY_SIZE-parametriin tehdyt muutokset otetaan käyttöön vasta, kun tietokantaesiintymä käynnistetään uudelleen. AMM (Automatic Memory Management) -toiminto ei myöskään koske varantoa. In-Memory Arean koon on oltava vähintään 100 Mt.
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.
In-Memory-asetuksia voi tarkastella seuraavalla kyselyllä:
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
inmemory_size-parametrin voi määrittää myös CDB- ja PDB-tasoilla. Jos määrität parametrin PDB-tasolla, esiintymää tai PDB:tä ei tarvitse käynnistää uudelleen. Kaikkien PDB-arvojen summa on pienempi tai yhtä suuri kuin CDB-arvo.
In-Memory-ominaisuuden voi ottaa käyttöön tai poistaa käytöstä PDB-tasolla seuraavasti:
Muodosta yhteys PDB:hen ja suorita seuraava komento:
Poistaminen käytöstä:
Alter system set inmemory_size=0; tai
Alter system reset inmemory_size;
Käyttöönotto:
Alter system set inmemory_size=20G;
In-Memoryn prioriteettitasot:
IM-sarakevarastoon pitäisi tallentaa ne tietokannan tiedot, joiden suorituskyky on kaikista kriittisintä. Tietoja, joiden suorituskyky on vähemmän kriittistä, voi säilyttää edullisemmassa flash-muistissa tai levyllä. Jos tietokanta on tarpeeksi pieni, voit tietysti tallentaa myös kaikki taulukot IM-sarakevarastoon. Databasen In-Memory-ominaisuus lisää taulukoille ja materialisoiduille näkymille uuden INMEMORY-määritteen.
INMEMORY-määritteen voi ottaa käyttöön
taulukkotila-, taulukko-, (ali)osio- ja materialisoitu näkymä -tasoilla.
Jos otat määritteen käyttöön taulukkotilatasolla, kaikki taulukkotilan taulukot ja materialisoidut näkymät tallennetaan oletusarvoisesti IM-sarakevarastoon.
alter tablespace quest INMEMORY;
Jos otat määritteen käyttöön taulukkotasolla, kaikki taulukon sarakkeet tallennetaan IM-sarakevarastoon. IM-sarakevarastoon voi halutessaan tallentaa myös vain osan sarakkeista.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
Saman voi tehdä myös osioidulle taulukolle.
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Taustaprosessit:
IMCO: IMCO-taustaprosessi käynnistää In-Memoryyn tallennettavaksi määritettyjen, LOW/MEDIUM/HIGH/CRITICAL-prioriteettitason kohteiden tallennuksen (esitallennuksen).
SMCO: SMCO luo dynaamisesti alisteisia prosesseja (Wnnn) suorittamaan nämä tehtävät.
Wnnn: Wnnn-prosessit suorittavat In-Memoryyn tallennettavaksi määritettyjen kohteiden tallennus- ja uudelleentallennustehtävät.
Kohteet tallennetaan IM-sarakevarastoon joko heti tietokannan avaamisen jälkeen prioriteettitason mukaan järjestettynä luettelona tai kun ne haetaan (niihin suoritetaan kysely) ensimmäistä kertaa. Kohteiden tallennusjärjestyksen määrää PRIORITY-avainsana, jolla on viisi eri tasoa. Oletusarvoinen PRIORITY-taso on NONE, mikä tarkoittaa, että kohde tallennetaan vasta, kun se haetaan ensimmäistä kertaa.
INMEMORY-lauseen PRIORITY-alilauseen hallitsemat prioriteettitasot:
Prioriteettitaso Kuvaus
CRITICAL Kohde tallennetaan heti, kun tietokanta avataan.
HIGH Kohde tallennetaan, kun kaikki CRITICAL-kohteet on tallennettu.
MEDIUM Kohde tallennetaan, kun kaikki CRITICAL- ja HIGH-kohteet on tallennettu.
LOW Kohde tallennetaan, kun kaikki CRITICAL-, HIGH- ja MEDIUM-kohteet on tallennettu.
NONE Kohde tallennetaan vasta, kun se haetaan ensimmäistä kertaa (oletus).
Alle 64 Kt:n kohteita ei tallenneta muistiin, sillä ne tuhlaisivat merkittävästi IM-sarakevaraston tilaa, joka on jaettu 1 Mt:n lohkoihin.
Esimerkki: alter table quest inmemory priority critical;
In-Memoryn pakkaustekniikat:
IM-sarakevarasto käyttää erityisiä pakkausmuotoja, jotka on optimoitu koon pienentämisen sijasta käytön nopeuttamiseen. Tietokanta nopeuttaa käyttöä seuraavilla tavoilla:
- Pakkausmuodot auttavat tietokantaa pienentämään kunkin sarakkeen kohdalla käsiteltävää muistimäärää. SQL käyttää suoraan pakattuja sarakkeita.
- Tietokanta käsittelee SIMD-vektorin käskyjen avulla joukon sarakearvoja yhdessä suorittimen kellojaksossa. Tietokanta voi säilyttää vektorissa useita arvoja, mikä maksimoi SIMD-vektorikäsittelyn suorituskykyedut.
In-Memoryn pakkaus määritetään avainsanalla MEMCOMPRESS, joka on INMEMORY-määritteen alilause. Pakkauksessa on kuusi eri tasoa, joilla on erilaisia vaikutuksia pakkaussuhteeseen ja käyttönopeuteen.
No Memcompress: tiedot tallennetaan In-Memoryyn ilman pakkausta.
Memcompress for DML: käytetään lähinnä DML:n nopeuttamiseen ja minimaaliseen pakkaukseen.
Memcompress for Query Low: optimoitu kyselyjen nopeuttamiseen (oletus).
Memcompress for Query High: optimoitu kyselyjen nopeuttamiseen ja tilan säästämiseen.
Memcompress for Capacity Low: säästää enemmän tilaa kuin Query High ja Query Low.
Memcompress for Capacity High: optimoitu tilan säästämiseen, jolloin käyttönopeus on hieman pienempi.
Pakkaussuhde voi vaihdella välillä 2 x–20 x valitusta pakkausasetuksesta, tietojen tyypistä ja taulukon sisällöstä riippuen.
Esimerkki: alter table quest inmemory memcompress for query high;
In-Memory-sarakevarasto RAC:ssä:
Klusteriympäristössä jokaisella solmulla on oma sarakevarasto. Klusterin kaikkien solmujen IM-sarakevarastojen on oltava samankokoisia. Muistiin tallennettavat kohteet jaetaan oletusarvoisesti klusterin kaikkien IM-sarakevarastojen kesken. Kohteiden jakamista klusterin IM-sarakevarastoihin hallitaan kahdella INMEMORY-määritteen alilauseella, DISTRIBUTE ja DUPLICATE (vain Engineered Systems -järjestelmät).
Distribute:
Distribute-alilause hallitsee tapaa, jolla kohteet jaetaan klusteriin. Kohteet voidaan jakaa seuraavilla tavoilla:
Distribute by rowid range: kohteet jaetaan eri solmuihin rowid-arvojen perusteella.
Distribute by partition: kohteet jaetaan eri solmuihin osioiden perusteella.
Distribute by sub partition: kohteet jaetaan eri solmuihin aliosioiden perusteella.
Esimerkki: alter table quest inmemory distribute by partition;
On tärkeää huomauttaa, että Oracle In-Memory RAC on kyselyjen suhteen ns.
shared-nothing-arkkitehtuuri. Jos siis suoritat kyselyn In-Memory-tietokohteisiin (olettaen, että kohteet on jaettu kahteen IM-sarakevarastoon), voit käyttää ainoastaan affiniteettisolmun tietoja, sillä klusterin eri esiintymät eivät jaa In-Memory-pakkausyksiköitä.
Voit siis määrittää
rinnakkaisuusasetukseksi AUTO. Rinnakkaisten kyselyjen koordinaattori tunnistaa In-Memory-pakkausyksiköiden muut esiintymät. Jos et voi määrittää rinnakkaisuusasetukseksi AUTOa, rinnakkaisten kyselyjen koordinaattori ei käytä muita In-Memory-pakkausyksiköiden esiintymiä.
Määritä rinnakkaisuusasetukseksi AUTO seuraavasti:
alter system set parallel_degree_policy=AUTO scope=both sid='*';
Duplicate:
Kohteet kopioidaan käytettävyyden parantamiseksi kaikkiin esiintymiin. Duplicate-alilauseella voit määrittää, että In-Memory-taulukko tallennetaan kaikkiin klusterin esiintymiin. Tämä vaihtoehto toimii ainoastaan Engineered Systems -järjestelmissä.
Esimerkki: alter table quest inmemory duplicate all;
quest-taulukko tallennetaan kaikkiin esiintymiin.
In-Memory-kohteiden valvonta:
Oracle on lisännyt In-Memory-kohteiden valvontaa varten kaksi uutta V$-näkymää:
v$IM_SEGMENTS tai v$IM_USER_SEGMENTS ja v$IM_COLUMN_LEVEL.
Näissä näkymissä voi selvittää, kuinka monta kohdetta IM-sarakevarastossa parhaillaan on.
Esimerkki:
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
Esimerkki:
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
Kahdella edellisen esimerkin taulukolla, Customer ja Supplier, ei ole arvoa INMEMORY-sarakkeessa. INMEMORY-määrite on segmenttitason määrite. Sekä Customer että Supplier ovat osioituja taulukoita, eli ne ovat loogisia kohteita. Näiden taulukoiden INMEMORY-määrite näkyy osio- tai aliosiotasolla *_TAB_ (SUB) PARTITIONS -näkymässä.
*_TABLES-näkymiin on lisätty myös kolme uutta saraketta – INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE ja INMEMORY_COMPRESSION – ilmaisemaan kunkin taulukon In-Memory-määritteitä.