Aşağıdakiler için geçerlidir:
Oracle veritabanı - 12.1.0.2
Yazar:
Mahesh Reddy M
Giriş:
Oracle veritabanı 12c In-Memory'nin sunulmasıyla birlikte artık tek bir veritabanı, işlemler için optimum performans sunarak ve aynı anda gerçek zamanlı analiz ve raporlamayı destekleyerek karma iş yüklerini verimli bir şekilde destekleyebilir. In-Memory, hem veri marketlerinin hem de veri ambarlarının daha fazla geçici analiz sunmasını sağlayarak son kullanıcıların işletmeyi destekleyen sorgulardan birini gönderebileceği sürede çok sayıda sorgu göndermesine olanak tanır. Bu özellikler In-Memory'de; sütunları, tabloları, bölümleri ve somutlaştırılmış görünümleri normal satır biçimi yerine sütun biçiminde depolayabilmenizi sağlar. In-Memory Sütun Deposu (IM sütun deposu), 12.1.0.2 yama setinin en önemli özelliğiydi.
Oracle Veritabanı 12c In-Memory Mimarisi:
Veriler geleneksel olarak yalnızca SATIR biçiminde saklanırken In-Memory veritabanı, verileri yalnızca sütun biçiminde saklar. Dolayısıyla Oracle Veritabanı 12c, çift biçim mimarisini destekler.
- Okuma/yazma işlemleri (veri kullanımları) için veri gerektiğinde bu veriler, geleneksel Satır Deposuna (Ön Arabellek) yüklenir
- Salt okuma işlemleri için veri gerektiğinde bu veriler, yeni In-Memory Sütun Deposuna doldurulur. Bu doldurma işlemi elbette, satır biçiminden sütun biçimine dönüşümü içerir.
- Ekleme, güncelleme veya silme içeren bir işlem gerçekleştirilirse yeni veriler, hem satır deposunda hem de in-memory sütun deposunda anında ve eş zamanlı olarak görünür. Dolayısıyla, iki depo da işlemler açısından tutarlıdır
In-Memory Sütun deposu:
In-Memory Veritabanı, In-Memory Alanı olarak adlandırılan Sistem Global Alanının (SGA) yeni bir bileşeni olan In-Memory sütun deposunu kullanır. IM sütun deposundaki veriler, geleneksel satır biçiminde tutulmaz; bunun yerine yeni bir sütun biçimi kullanılır. IM sütun deposu, ön arabelleğin yerine geçmez ancak destek işlevi görür; böylece veriler artık hem satır hem de sütun biçiminde In-Memory'de saklanabilir
In-Memory alanı, başlatma parametresi olan INMEMORY_SIZE (varsayılan olarak 0) tarafından kontrol edilen, SGA içindeki statik bir havuzdur. In-Memory alanının mevcut boyutu, V$SGA'da görülebilir
IM Sütun deposu iki alt havuza ayrılmıştır:
- 1 MB pool (1 MB havuz): Esas verileri sütun biçiminde saklar
- 64K pool (64 KB havuz): Nesneler hakkındaki meta verileri saklar.
Aşağıdaki sorguyu kullanarak her bir havuzdaki kullanılabilir bellek miktarını görebiliriz:
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 |
Tablo 1: Her havuzdaki kullanılabilir bellek
IM Sütun deposunu etkinleştirin:
Statik bir havuz olarak INMEMORY_SIZE parametresinde yapılan değişiklikler, veritabanı örneği yeniden başlatılana kadar geçerli olmaz. Ayrıca, Otomatik Bellek Yönetimi (AMM) tarafından etkilenmez veya denetlenmez. In-Memory alanı, minimum 100 MB boyutunda olmalıdır.
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.
Aşağıdaki sorgu kullanılarak In-Memory ayarları görüntülenebilir:
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 parametresi, CDB ve PDB düzeyinde de ayarlanabilir. Bu parametreyi PDB düzeyinde ayarlarsanız örneği veya PDB'yi yeniden başlatmanız gerekmez. Tüm PDB değerlerinin toplamı, CDB değerinden daha düşük veya buna eşittir.
Aşağıda gösterildiği gibi In-Memory seçeneği PDB düzeyinde etkinleştirilebilir ve devre dışı bırakılabilir
PDB'ye bağlanın ve ardından aşağıdaki komutu yürütün:
Devre dışı bırakma:
Alter system set inmemory_size=0; veya
Alter system reset inmemory_size;
Etkinleştirme:
Alter system set inmemory_size=20G;
In-Memory öncelik düzeyleri:
IM sütun deposu, veritabanındaki performans açısından en kritik olan verilerle doldurulmalıdır. Performans açısından daha az kritik olan veriler, daha düşük maliyetli flash veya disk üzerinde tutulabilir. Elbette, veritabanınız yeterince küçükse tüm tablolarınızı IM sütun deposuna doldurulabilirsiniz. In-Memory Veritabanı, tablolar ve somutlaştırılmış görünümler için yeni bir INMEMORY özniteliği ekler.
INMEMORY özniteliğini şu öğelerde etkinleştirebiliriz:
Tablo alanı, Tablo, (alt) bölüm ve somutlaştırılmış görünüm.
Bu özniteliği tablo alanı düzeyinde etkinleştirirseniz tablo alanındaki tüm tablolar ve somutlaştırılmış görünümler varsayılan olarak IMCOLUMN deposu için etkinleştirilir.
alter tablespace quest INMEMORY;
Tablo düzeyinde bu özniteliği etkinleştirirseniz tüm tablo sütunlarının IMCOLUMN deposuna doldurulması gerekir. Ancak sütunların yalnızca bir alt kümesi, IMCOLUMN deposuna doldurulabilir.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
Benzer şekilde, bölümlenmiş tablo için:
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Arkaplan Süreçleri:
IMCO: IMCO arkaplan süreci, In-Memory etkinleştirilmiş nesnelerin LOW/MEDIUM/HIGH/CRITICAL (DÜŞÜK/ORTA/YÜKSEK/KRİTİK) öncelik düzeyi ile doldurulması (önceden doldurma) işlemini başlatır.
SMCO: SMCO, bu görevleri uygulamak için alt süreçleri (Wnnn) dinamik olarak üretir.
Wnnn: Wnnn süreçleri, In-Memory etkinleştirilmiş nesnelerin doldurulması veya yeniden doldurulması için In-Memory doldurma ya da In-Memory yeniden doldurma görevlerini yürütür.
Nesneler, ya veritabanı açıldıktan hemen sonra önceliklendirilmiş bir listede ya da nesneler ilk kez tarandıktan (sorgulandıktan) sonra IM sütun deposuna doldurulur. Nesnelerin doldurulma sırası, beş düzeye sahip PRIORITY (ÖNCELİK) anahtar kelimesi tarafından kontrol edilir. Varsayılan PRIORITY (ÖNCELİK), NONE'dır (HİÇBİRİ). Bu, bir nesnenin ancak ilk kez tarandıktan sonra doldurulacağı anlamına gelir
INMEMORY yan tümcesinin PRIORITY (ÖNCELİK) yan tümcesi tarafından denetlenen farklı öncelik düzeyleri
Öncelik Düzeyi Açıklama
CRITICAL (KRİTİK) Nesne, veritabanı açıldıktan hemen sonra doldurulur
HIGH (YÜKSEK) Nesne, tüm CRITICAL (KRİTİK) nesneler doldurulduktan sonra doldurulur
MEDIUM (ORTA) Nesne, tüm CRITICAL (KRİTİK) ve HIGH (YÜKSEK) nesneler doldurulduktan sonra doldurulur
LOW (DÜŞÜK) Nesne, tüm CRITICAL (KRİTİK), HIGH (YÜKSEK) ve MEDIUM (ORTA) nesneler doldurulduktan sonra doldurulur
NONE (HİÇBİRİ) Nesneler, yalnızca ilk kez tarandıktan sonra doldurulur (Varsayılan)
Belleğin 1 MB'lik öbekler halinde ayrılması nedeniyle 64 KB'den küçük olan nesneler, IM sütun deposunun içinde önemli miktarda yer harcayacağından bellek içine doldurulmaz.
Örnek: alter table quest inmemory priority critical;
In-Memory Sıkıştırma Teknikleri:
IM sütun deposu, depolama azaltması yerine erişim hızı için optimize edilmiş özel sıkıştırma biçimleri kullanır. Veritabanı, hızı aşağıdaki yollarla artırır:
- Sıkıştırma biçimleri, veritabanının her bir sütun için işlenen bellek miktarını azaltabilmesini sağlar. SQL doğrudan sıkıştırılmış sütunlar üzerinde çalışır.
- Veritabanı, tek bir CPU saat döngüsünde bir dizi sütun değerini işlemek için SIMD vektörü (dizi) talimatlarını kullanır. Veritabanı, bir vektörde çok sayıda değer depolayabilir; bu da, SIMD vektör işlemesinin performans avantajlarını en üst düzeye çıkarır.
In-memory sıkıştırma, INMEMORY özniteliğinin bir alt tümcesi olan MEMCOMPRESS anahtar sözcüğü kullanılarak belirtilir. Her biri farklı bir sıkıştırma ve performans seviyesi sunan altı düzey mevcuttur.
No Memcompress (Memcompress Yok): Veriler sıkıştırma olmaksızın In-Memory'ye doldurulur.
Memcompress for DML (DML İçin Memcompress): Genel olarak DML performansı ve en az sıkıştırma içindir.
Memcompress for Query Low (Düşük Sorgu İçin Memcompress): Sorgu performansı için optimize edilmiştir (Varsayılan).
Memcompress for Query High (Yüksek Sorgu İçin Memcompress): Sorgu performansı ve alandan tasarruf için optimize edilmiştir
Memcompress for Capacity Low (Düşük Kapasite İçin Memcompress): Query High ve Query Low'a kıyasla daha fazla alandan tasarruf
Memcompress for Capacity High (Yüksek Kapasite İçin Memcompress): Alandan tasarruf ve biraz daha düşük performans için optimize edilmiştir.
Sıkıştırma oranları; belirlenen sıkıştırma seçeneğine, veri türüne ve tablonun içeriğine bağlı olarak 2X - 20X arasında değişiklik gösterebilir.
Örnek: alter table quest inmemory memcompress for query high;
RAC'de In-Memory Sütun Deposu:
Küme ortamında her düğümün kendi sütun deposu vardır. Kümedeki her düğüm, IM Sütun Deposuna eşit boyutta tutulmalıdır. Belleğe doldurulan tüm nesneler, varsayılan olarak kümedeki tüm IM sütun depoları üzerinden dağıtılır. Nesnelerin bir kümedeki IM sütun depolarına dağıtılması, INMEMORY özniteliğine eklenen iki ek alt tümce tarafından kontrol edilir: DISTRIBUTE (DAĞITMA) ve DUPLICATE (ÇOĞALTMA) (Yalnızca özel olarak tasarlanmış sistemlerde).
Distribute (Dağıtma):
Nesneler küme boyunca dağıtılır ve bu dağıtım, "distribute" alt tümcesi ile kontrol edilir. Nesneleri aşağıdaki yöntemlerle dağıtabilirsiniz:
Distribute by rowed range (Satır aralığına göre dağıt): Nesneleri, farklı düğüm satırlarına göre dağıtır
Distribute by Partition (Bölüme göre dağıt): Bölümleri küme içindeki düğümlere dağıtır
Distribute by sub partition (Alt bölüme göre dağıt): Alt bölümü farklı düğümlere dağıtır.
Örnek: alter table quest inmemory distribute by partition;
Burada, Oracle In-Memory RAC'nin sorgular için
kaynak-paylaşımsız mimari kullandığını belirtmek önemlidir. Örneğin, In-Memory veri nesneleri için bir sorgu oluşturursanız (nesnelerin iki IM sütun deposuna dağıtıldığını varsayalım) yalnızca benzeşim düğümündeki verilere erişim sağlayabilirsiniz. Bu IMCU'ların (In-Memory Sıkıştırma birimleri) küme içindeki örneklerde paylaşılmadığı anlamına gelir.
Dolayısıyla,
paralellik düzeyini (DOP) AUTO (OTOMATİK) olarak belirleyebilirsiniz. Paralel sorgu yürütücüsü, diğer IMCU konumu örneklerini tespit eder. DOP'u AUTO (OTOMATİK) olarak ayarlayamazsanız paralel sorgu yürütücüsü, diğer IMCU örneklerini kullanmaz.
set the degree of parallel to auto
alter system set parallel_degree_policy=AUTO scope=both sid='*';
Duplicate (Çoğaltma):
Kullanılabilirliği artırmak için nesneler tüm örneklere kopyalanır. In-Memory tablosunun küme içindeki tüm örneklerde saklandığını belirtmek için "duplicate" alt tümcesini kullanabilirsiniz. Özel olarak tasarlanmayan sistemlerde bu seçenek çalışmaz.
Örnek: alter table quest inmemory duplicate all;
Quest tablosu tüm örneklerde depolanır.
In-Memory Nesnelerini İzleme:
In-Memory nesnelerini izlemek için Oracle iki yeni V$ görünümü sunmaktadır:
v$IM_SEGMENTS veya v$IM_USER_SEGMENTS ve v$IM_COLUMN_LEVEL.
Bu görünümler kullanılarak şu anda IMCOLUMN deposuna kaç nesnenin doldurulmuş olduğu öğrenilebilir.
EX:
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
EX:
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
Yukarıdaki örnekte, Customer ve Supplier adlı iki tablonun INMEMORY sütunu için bir değere sahip olmadığı görülmektedir. INMEMORY özniteliği, segment düzeyinde bir özniteliktir. Hem Customer hem de Supplier, bölümlenmiş tablolardır ve dolayısıyla mantıksal nesnelerdir. Bu tablolar için INMEMORY özniteliği, *_TAB_ (SUB) PARTITIONS öğesinde bölüm veya alt bölüm düzeyinde kaydedilir.
Ayrıca, INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE ve INMEMORY_COMPRESSION şeklindeki üç ek sütun her bir tablo için geçerli InMemory özniteliklerini belirtmek üzere *_TABLES görünümlerine eklenmiştir.