Oracle Database 12c Release 1 (12.1.0.2) In-Memory Option

Posted by | Ekim 17, 2014 | Database, Genel | No Comments

12c

Oracle 12c, 12.1.0.2 patchset ile in-memory opsiyonunu duyurdu. Bu özellik ile geleneksel olarak row formatta tutulan verileri kolon bazında saklama yeteneğine sahip olacağız. Özellikle iş zekası ve veri analizi uygulamaları için oldukça kullanışlı olacak bu özellik ile operasyonel veri ve analiz verisi için ayrı ortamlar oluşturma, yönetme maliyetlerinin önüne geçilmiş, sahip olunan veriler tüm amaçlar için tek bir ortamda saklanır hale getirilmiş olacaktır.

Giriş
In-memory kolon saklama SGA içerisinde yer alan yeni bir bölümdür. INMEMORY_SIZE  parametresi ile ayarlanır. Farklı gruptaki kolonları, tabloları bu yolla saklayabiliriz. Ayrıca bu opsiyonu tablespace seviyesinde de uygulayabiliriz. Böylelikle ilgili tablespace içerisinde yer alan tüm tablo ve materialized view’lar için bu seçenek otomatik olarak devreye alınmış olacaktır.

Bu aşamada belirtmekte yarar gördüğüm bir nokta var. Bu opsiyonun kullanımına uygun verilerin doğru tesbiti hayati öneme sahiptir. Doğru kurgulanmış bir yapı ile performansta ciddi kazanımlar elde edileceği gibi, tersi durumda buffer-cache üzerinde boş yere bellek harcanmasına sebebiyet verilebilir.

Etkinleştirme
Kullanılacak bellek alanının SGA’in bir parçası olduğu unutulmamalı ve ayarlama buna göre yapılmalıdır. Multitenant yapılar için INMEMORY_SIZE parametresi CDB de set edilmelidir.

Bu örneğimizde INMEMORY_SIZE parametresini 2G olarak kullanıyor olacağız.

ALTER SYSTEM SET SGA_TARGET=3G SCOPE=SPFILE;
ALTER SYSTEM SET INMEMORY_SIZE=2G SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

ORACLE instance started.

Total System Global Area 3221225472 bytes
Fixed Size                  2929552 bytes
Variable Size             419433584 bytes
Database Buffers          637534208 bytes
Redo Buffers               13844480 bytes
In-Memory Area           2147483648 bytes
Database mounted.
Database opened.
SQL>

Veritabanımız açılırken “In-Memory Area” diye yeni bir satırımızın olduğunu göreceksiniz.
Boyutu dışında IM ile ilgili diğer tüm parametreler ön-tanımlı olarak bırakılmıştır.

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                        big integer 2G
inmemory_trickle_repopulate_servers_ integer     1
percent
optimizer_inmemory_aware             boolean     TRUE
SQL>

INMEMORY_SIZE parametresi tüm PDB ler tarafından ortak olarak kullanılır. PDB seviyesinde INMEMORY_SIZE parametresinin değiştirilmesi instance veya PDB’nin yeniden başlatılmasını gerektirmez.

CONN sys@pdb1 AS SYSDBA
-- Disable IM column store in the PDB
ALTER SYSTEM SET INMEMORY_SIZE=0;
-- OR
ALTER SYSTEM RESET INMEMORY_SIZE;

-- Assign a PDB-specific size.
ALTER SYSTEM SET INMEMORY_SIZE=1G;

Devredışı Bırakma
Bu işlemi gerçekleştirmenin farklı yolları bulunmaktadır.
INMEMORY_FORCE parametresini “OFF” olarak set etmek nesnelerin IM kolon olarak saklanamayacağını belirtir. “DEFAULT” olarak set etmek ön-tanımlı değerlere geri döndürür.

-- System level
ALTER SYSTEM SET INMEMORY_FORCE=OFF;
ALTER SYSTEM SET INMEMORY_FORCE=DEFAULT;

INMEMORY_QUERY parametresini “DISABLE” olarak set etmek optimiser’in sorguları IM kolon saklamaya göre düzenlemeyeceği anlamını taşır. “ENABLE” olarak set etmek ön-tanımlı yapıya geri döndürür.

-- System level
ALTER SYSTEM SET INMEMORY_QUERY=DISABLE;
ALTER SYSTEM SET INMEMORY_QUERY=ENABLE;

-- Session level
ALTER SESSION SET INMEMORY_QUERY=DISABLE;
ALTER SESSION SET INMEMORY_QUERY=ENABLE;

IM kolon saklama özelliğini tamamen devre dışı bırakmak INMEMORY_SIZE parametresi ile kendisi için tanımlanan belleği serbest bırakır.

ALTER SYSTEM RESET INMEMORY_SIZE SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

Daha önceki bölümde de bahsedildiği gibi PDB ye özel düzenlemeler instance veya PDB seviyesinde yeniden başlatma gerektirmez.

Tabloları Düzenleme:

Örnekte tablo oluşturmayı üç farklı versiyonda göreceğiz.

CONN demo/demo@pdb1

CREATE TABLE im_tab (
  id  NUMBER
) INMEMORY;

CREATE TABLE noim_tab (
  id  NUMBER
) NO INMEMORY

CREATE TABLE default_tab (  id  NUMBER
);

COLUMN table_name FORMAT A20

SELECT table_name,
       inmemory IM,
       inmemory_priority IM_PRI,
       inmemory_distribute IM_DIST,
       inmemory_compression IM_COMP,
       inmemory_duplicate  IM_DUP
FROM   user_tables
ORDER BY table_name;

TABLE_NAME  IM       IM_PRI   IM_DIST IM_COMP       IM_DUP
----------- -------- -------- ------- --------      -----------
DEFAULT_TAB DISABLED
IM_TAB      ENABLED  NONE     AUTO    FOR QUERY LOW NO DUPLICATE
NOIM_TAB    DISABLED

3 rows selected.

SQL>

ALTER TABLE komutu ile nesnelerin IM durumu değiştirilebilir. Aşağıda bunun örneğini görebiliriz.

ALTER TABLE IM_TAB NO INMEMORY;
ALTER TABLE NOIM_TAB INMEMORY MEMCOMPRESS FOR CAPACITY LOW;
ALTER TABLE DEFAULT_TAB INMEMORY PRIORITY HIGH;

SELECT table_name,
       inmemory IM,
       inmemory_priority IM_PR,
       inmemory_distribute IM_DIS,
       inmemory_compression IM_COMP,
       inmemory_duplicate  IM_DUP
FROM   user_tables
ORDER BY table_name;
 TABLE_NAME IM       IM_PR IM_DIS IM_COMP          IM_DUP
----------- -------- ----- ------ -------          -----------
DEFAULT_TAB ENABLED  HIGH  AUTO   FOR QUERY LOW    NO DUPLICATE
IM_TAB      DISABLED
NOIM_TAB    ENABLED  NONE  AUTO   FOR CAPACITY LOW NO DUPLICATE

3 rows selected. 
SQL>

Kolonları Düzenleme

Aşağıdaki örnekte IM Kolon saklama ile ilgili kolon düzenlemeye ilişkin söz dizimini görebiliriz.

CREATE TABLE im_col_tab (
  id   NUMBER,
  col1 NUMBER,
  col2 NUMBER,
  col3 NUMBER,
  col4 NUMBER
) INMEMORY
INMEMORY MEMCOMPRESS FOR QUERY HIGH (col1, col2)
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)
NO INMEMORY (id, col4);

Kolon ayarlarına V$IM_COLUMN_LEVEL view’ı üzerinden erişilebilir.

CONN sys@pdb1 AS SYSDBA

SELECT table_name,
       segment_column_id,
       column_name,
       inmemory_compression
FROM   v$im_column_level
WHERE  owner = 'TEST'
and    table_name = 'IM_COL_TAB'
ORDER BY segment_column_id;

TABLE_NAME  SEGMENT_COLUMN_ID COLUMN_NAME  INMEMORY_COMPRESSION
----------  ----------------- ------------ ---------------
IM_COL_TAB                 1  ID NO        INMEMORY
IM_COL_TAB                 2  COL1         FOR QUERY HIGH
IM_COL_TAB                 3  COL2         FOR QUERY HIGH
IM_COL_TAB                 4  COL3         FOR CAPACITY HIGH
IM_COL_TAB                 5  COL4         NO INMEMORY

5 rows selected.

SQL>

Aynı şekilde kolon ayarları ALTER TABLE komutu ile düzenlenebilir.

CONN test/test@pdb1

ALTER TABLE im_col_tab 
NO INMEMORY (col1, col2)
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)
NO INMEMORY (id, col4);

CONN sys@pdb1 AS SYSDBA

SELECT table_name,
       segment_column_id,
       column_name,
       inmemory_compression
FROM   v$im_column_level
WHERE  owner = 'TEST'
and    table_name = 'IM_COL_TAB'
ORDER BY segment_column_id;
TABLE_NAME  SEGMENT_COLUMN_ID COLUMN_NAME  INMEMORY_COMPRESSION
----------  ----------------- ------------ ---------------
IM_COL_TAB                 1  ID           NO INMEMORY
IM_COL_TAB                 2  COL1         NO INMEMORY
IM_COL_TAB                 3  COL2         NO INMEMORY
IM_COL_TAB                 4  COL3         FOR CAPACITY HIGH
IM_COL_TAB                 5  COL4         NO INMEMORY

5 rows selected.

SQL>

Materialized Viewları Düzenleme

CREATE MATERIALIZED VIEW ve ALTER MATERIALIZED VIEW komutları tıpkı CREATE TABLE ve ALTER TABLE komutlarında olduğu gibi Materialized View’ların oluşturulmasında ve düzenlenmesinde kullanılabilir.

CONN test/test@pdb1

CREATE TABLE t1 AS
  SELECT * FROM all_objects;

CREATE MATERIALIZED VIEW t1_mv INMEMORY 
  AS SELECT * FROM t1;

SELECT table_name,
       inmemory IM,
       inmemory_priority IM_PRI,
       inmemory_distribute IM_DIST,
       inmemory_compression IM_COMP,
       inmemory_duplicate  IM_DUP
FROM   user_tables
WHERE  table_name = 'T1_MV';

TABLE_NAME  IM       IM_PRI   IM_DIST IM_COMP       IM_DUP
----------- -------- -------- ------  ------------- -----------
T1_MV       ENABLED  NONE     AUTO   FOR QUERY LOW  NO DUPLICATE

1 row selected.

SQL>

ALTER MATERIALIZED VIEW t1_mv
  INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY HIGH;

SELECT table_name,
       inmemory IM,
       inmemory_priority IM_PRI,
       inmemory_distribute IM_DIST,
       inmemory_compression IM_COMP,
       inmemory_duplicate  IM_DUP
FROM   user_tables
WHERE  table_name = 'T1_MV';

TABLE_NAME  IM     IM_PRI   IM_DIST IM_COMP      IM_DUP
---------- ------- -------- ------  --------     -----------
T1_MV      ENABLED HIGH     AUTO    FOR CAPACITY HIGH NO DUPLICATE

1 row selected.

SQL>

ALTER MATERIALIZED VIEW t1_mv NO INMEMORY;

SELECT table_name,
       inmemory IM,
       inmemory_priority IM_PRI,
       inmemory_distribute IM_DIST,
       inmemory_compression IM_COMP,
       inmemory_duplicate  IM_DUP
FROM   user_tables
WHERE  table_name = 'T1_MV';

TABLE_NAME  IM       IM_PRI   IM_DIST IM_COMP       IM_DUP
----------- -------- -------- ------ --------      -----------
T1_MV       DISABLED

1 row selected.

SQL>

Tablespace’leri yönetme

IM kolon saklamaya ilişkin parametrelerin tablespace seviyesinde düzenlenmesi demek, bu tablespace içerisinde yer alan tüm tablo ve materialized view’ların bu parametreleri kullanacağı anlamına gelmektedir.

Aşağıdaki örnekte IM kolon saklama parametrelerinin tablespace oluşturulması sürecinde nasıl set edileceği anlatılmaktadır.
DEFAULT belirteci IM yapılandırmasının temel bir parçasıdır ve DBA_TABLESPACES view’ı üzerinden görüntülenebilir.

CONN sys@pdb1 AS SYSDBA

CREATE TABLESPACE new_ts
   DATAFILE '/u01/app/oracle/oradata/CDB1/datafile/pdb1/
   pdb1_new_ts.dbf'
   SIZE 10M DEFAULT INMEMORY;

SELECT tablespace_name TBLSPACE_NAME, 
       def_inmemory IM,
       def_inmemory_priority PRI,
       def_inmemory_distribute DIST,
       def_inmemory_compression COMP,
       def_inmemory_duplicate DUP
FROM   dba_tablespaces
ORDER BY tablespace_name;

TBLSPACE_NAME IM       PRI    DIST  COMP          DUP
------------- -------- ------ ----- ------------- --------
NEW_TS        ENABLED  NONE   AUTO  FOR QUERY LOW NO DUPLICATE
SYSAUX        DISABLED
SYSTEM        DISABLED
TEMP          DISABLED
USERS         DISABLED

5 rows selected.

SQL>

ALTER TABLESPACE komutu IM kolon saklama parametrelerini değiştirmekte kullanılır.

ALTER TABLESPACE new_ts
  DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;

SELECT tablespace_name TBLSPACE_NAME, 
       def_inmemory IM,
       def_inmemory_priority PRI,
       def_inmemory_distribute DIST,
       def_inmemory_compression COMP,
       def_inmemory_duplicate DUP
FROM   dba_tablespaces
ORDER BY tablespace_name;

TBLSPACE_NAME IM       PRI    DIST  COMP              DUP
-----------   -------- ------ ----- -------------     --------
NEW_TS        ENABLED  NONE   AUTO  FOR CAPACITY HIGH NO DUPLICATE
SYSAUX        DISABLED
SYSTEM        DISABLED
TEMP          DISABLED
USERS         DISABLED

SQL>


ALTER TABLESPACE new_ts
  DEFAULT NO INMEMORY;

SELECT tablespace_name TBLSPACE_NAME, 
       def_inmemory IM,
       def_inmemory_priority PRI,
       def_inmemory_distribute DIST,
       def_inmemory_compression COMP,
       def_inmemory_duplicate DUP
FROM   dba_tablespaces
ORDER BY tablespace_name;

TBLSPACE_NAME IM       PRI    DIST  COMP          DUP
------------- -------- ------ ----- ------------- --------
NEW_TS        DISABLED
SYSAUX        DISABLED
SYSTEM        DISABLED
TEMP          DISABLED
USERS         DISABLED

5 rows selected.

SQL>

İlgili View’lar
• V$IM_COLUMN_LEVEL
• V$IM_SEGMENTS
• V$IM_USER_SEGMENTS

Daha fazla bilgi için:
• Using the In-Memory Column Store

Leave a comment

Your email address will not be published. Required fields are marked.