Oracle DB Memory Techniken für mehr Performance

Werbung
Oracle DB Memory Techniken
für mehr Performance
Buffer Cache, Result Cache, Big Table Caching, Column Store ...
Ulrike Schwinn
E-mail: [email protected]
Business Unit Database
Oracle Deutschland B.V. & Co KG
Copyright © 2014 Oracle and/or its affiliates. All rights reserved. |
Die Memory Nutzung in der Datenbank
• Billigste Tuning Massnahme lautet:
Vorhandenes Ressourcen richtig nutzen! ☺
• Fragen:
– Wird das vorhandene Memory (sinnvoll) genutzt?
(Beispielkonfiguration: 250G Memory für Server und 20G Memory für die
Datenbank)
• Bereiche: Innerhalb des Servers und innerhalb der Datenbank
– Würden meine Anwendungen von mehr Memory profitieren? (Extrapolation)
• Oracle Werkzeuge: AWR, ASH, statspack, V$Views für Segmentstatistiken,
Advisors, Performance Hub, SQL Monitoring etc.
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Database Buffer
Plattformspezifisch
(Engineered Systems)
Shared Pool
Memory für die
Oracle
Datenbank
2nd
Level Cache
Columnstore der
In-Memory DB
Optimierende
Techniken
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
3
Buffer Cache
Default Cache
Keep/Recycle Cache
ABTC
Full Database
Caching
Shared Pool
Plattformspezifisch
(Engineered Systems)
Memory für die
Oracle
Datenbank
2nd
Level Cache
Columnstore der
In-Memory DB
Optimierende
Techniken
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
4
Standard System Global Area (SGA) Komponenten
Shared Pool
Buffer Cache
Large Pool
ABTC
Flashback
Redo Log
Java
Pool
Fixed SGA
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Wann wird der Buffer Cache genutzt?
• Abhängig von
‒ Segmentgröße (SMALL Table etc.)
‒ Zugriffsart
‒ Häufigkeit des Zugriffs (Hot, Cold)
• Erweiterungen in 12c
ABTC
– Automatic Big Table Caching
– Full Database Caching
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Buffer Cache - Konfiguration
• Default Cache: Manuell über DB_CACHE_SIZE
– Nutzung der Standard Blockgröße
• Falls SGA_TARGET gesetzt ist, erfolgt automatische Konfiguration
– Setzen von DB_CACHE_SIZE entspricht Minimalwert
• Buffer Cache mit Nicht Standard Blockgröße über Parameter
DB_CACHE_nK_SIZE
– Voraussetzung für Tablespaces mit Nicht Standard Blockgrößen
• Beispiele: Erhöhung des Komprimierungsfaktors ...
• Memory Advisor - Extrapolation
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Buffer Cache Pools: KEEP und RECYCLE Pools
• Häufig und weniger häufig genutzte Objekte in verschiedenen
Pools
– Über Parameter DB_KEEP_CACHE_SIZE und DB_RECYCLE_CACHE_SIZE
– Alle Buffer-Pools funktionieren gleich - nach LRU Algorithmus!
• Festlegung der Pools und danach Zuordnung der Objekte
– Alle Segmenttypen unterstützt (LOB, INDEX, ...)
• Gedacht für:
– Objekte im KEEP Pool sind HOT und sollen nicht verdrängt werden.
– Objekte im RECYCLE Pool sollen anderen „Hot“ Objekten keinen Platz wegnehmen.
• Monitoring über V$DB_CACHE_ADVICE
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
KEEP-Pool: Vorgehensweise
1. Pool-Größe definieren: DB_KEEP_CACHE_SIZE
2. Objekte per Storage-Klausel dem KEEP-Pool zuweisen
ALTER TABLE ... STORAGE (buffer_pool keep)
ALTER INDEX ... STORAGE (buffer_pool keep)
ALTER TABLE ... MODIFY LOB (lobcol) (STORAGE (buffer_pool keep))
3. Bei Bedarf: "Pre-Load" der Objekte in den KEEP-Pool
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Sind die Objekte im Cache?
• Analyse über ...
– Ausführungsplan, spezielle Statistiken , V$ Views ...
• Beispiel: V$BH listet die Blöcke auf, die im Moment im Buffer Cache sind.
SELECT o.object_name, o.object_type, o.owner, COUNT(*) NUMBER_OF_BLOCKS
FROM dba_objects o, v$bh bh
WHERE o.data_object_id = bh.objd
AND o.owner in ('SH')
GROUP BY o.object_name, o.owner, o.object_type
ORDER BY COUNT(*);
OBJECT_NAME
OBJECT_TYPE
OWNER
NUMBER_OF_BLOCKS
------------------------------ --------------- --------------- ---------------CUSTOMERS
TABLE
SH
3
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Wie funktioniert Pre-Loading von Objekten?
• Auslösen eines Objekt-Scans über die Tabelle, den Index, das Lobsegment
– SELECT-Anweisung (u.U mit Hint)
SELECT /*+ FULL(T1) */ sum(numeric_column), min(txt_column) FROM tabelle T1;
SELECT /*+ FULL(T2) */ dbms_lob.getlength(lob_column) FROM tabelle T2;
• Achtung: Optimierungen des Buffer Cache beachten!
– Parameter _small_table_threshhold setzen (MOS Note: 787373.1)
ALTER SESSION SET "_small_table_threshold"= 2000;
-- wobei Zahl die Blockgröße angibt, die größer als das Segment ist.
-- danach kann der FTS ausgeführt werden
– Beschreibung in DBA Community-Tipp: Pre-Loading von Tabellen in 11g
https://apex.oracle.com/pls/apex/GERMAN_COMMUNITIES.SHOW_RESOURCE_BY_FNAME?P_TIPP_ID=362&P_FILE_NAME=index.html
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Automatic Big Table Cache
• Neu in 12.1.0.2
• Neuer Bereich im Buffer Cache
• Gedacht für Segmente, die parallel oder
seriell ge-scannt werden
ABTC
• Einstellbar im Single Instanz oder RAC
Umfeld
• Temperatur basierende Methode für die
Segment Platzierung (nicht nur Blöcke)
– Beschreibung
in DBA Community-Tipp: Automatic Big Table Caching in 12c
https://apex.oracle.com/pls/apex/GERMAN_COMMUNITIES.SHOW_TIPP?P_ID=3841
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Vorher …
SQL> select sum(prod_id) from sh.sales_copy;
Execution Plan
---------------------------------------------------------Plan hash value: 2728018880
--------------------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------| 0 | SELECT STATEMENT |
| 1
| 4
| 9629 (1)| 00:00:01 |
| 1 | SORT AGGREGATE
|
| 1
| 4
|
|
|
| 2 | TABLE ACCESS FULL| SALES_COPY | 7350K| 28M
| 9629 (1)| 00:00:01 |
--------------------------------------------------------------------------------Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
35346 consistent gets
35341 physical reads
0 redo size
550 bytes sent via SQL*Net to client ….
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Automatic Big Table Cache - Setup
• Im laufenden Betrieb
– Im Single Instanz Umfeld
• DB_BIG_TABLE_CACHE_PERCENT_TARGET auf Prozentanteil des Buffer Cache
SQL> ALTER SYSTEM SET db_big_table_cache_percent_target=70;
System altered
– Zusätzlich im RAC Umfeld
• PARALLEL_DEGREE_POLICY auf AUTO oder ADAPTIVE (neu in 12c)
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Automatic Big Table Cache – In Aktion
• Big Table Cache im Überblick
SQL> SELECT bt_cache_alloc, bt_cache_target, object_count, memory_buf_alloc, min_cached_temp
FROM v$bt_scan_cache;
BT_CACHE_ALLOC BT_CACHE_TARGET OBJECT_COUNT MEMORY_BUF_ALLOC
-------------- --------------- ------------ ---------------.700002878
70
3
58009
• Objekte im Cache
SQL> SELECT o.object_name, cached_in_mem, size_in_blks, policy, temperature
FROM v$bt_scan_obj_temps bt, dba_objects o WHERE bt.dataobj#=o.object_id;
OBJECT_NAME
CACHED_IN_MEM SIZE_IN_BLKS POLICY
TEMPERATURE
-------------------- ------------- ------------ ---------- ----------FACT_PP_OUT_ITM_XXX
44878
44878 MEM_ONLY
186000
AB_ELEMENT_RELA
2644
2644 DISK
1000
SALES_COPY
35421
35421 MEM_ONLY
6000
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Nachher mit ABTC
SQL> select sum(prod_id) from sh.sales_copy;
Execution Plan
---------------------------------------------------------Plan hash value: 2728018880
-------------------------------------------------------------------------------| Id | Operation
| Name
| Rows | Bytes | Cost (%CPU)| Time
|
-------------------------------------------------------------------------------| 0 | SELECT STATEMENT |
| 1
| 4
| 9629 (1)
| 00:00:01 |
| 1 | SORT AGGREGATE
|
| 1
| 4
|
|
|
| 2 | TABLE ACCESS FULL| SALES_COPY | 7350K| 28M
| 9629 (1)
| 00:00:01 |
-------------------------------------------------------------------------------Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
35354 consistent gets
0 physical reads
0 redo size …
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Full Database Caching
• Neu in 12.1.0.2
• Datenbank komplett in der SGA (Buffer Cache) halten
• Force Full Caching Mode
Die Datenbank lädt alle Objekte in den Buffer Cache und hält sie dort (keine Auslagerung mehr). Auch
NOCACHE-Objekte (LOBs) sind betroffen=> Performance von FULL TABLE Scans und LOBs
• Information in Dictionary View V$DATABASE
SELECT force_full_db_caching FROM V$DATABASE;
FORCE_FULL_DB_CACHING
------------------------NO
• Objekte werden bei Zugriff (Access) geladen, nicht sofort
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Full Database Caching: Vorgehensweise
• Sicherstellen, dass der Buffer Cache tatsächlich groß genug ist
• Force Full Database Caching aktivieren mit ...
STARTUP MOUNT;
ALTER DATABASE FORCE FULL DATABASE CACHING;
ALTER DATABASE OPEN;
• Meldung in Alert Datei beachten
Mon Nov 02 16:07:22 2015
Buffer Cache Force Full DB Caching mode on when DB does not fit
in cache. Turning off Force Full DB Caching advisable
• Full DB Caching wird auf Ebene der Container-Datenbank eingestellt
– Alle Pluggable Databases betroffen
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Database Buffer
Plattformspezifisch
(Engineered Systems)
Shared Pool
Memory für die
Oracle
2nd Level Cache
Read-only Overflow für
DB Block Buffers
Datenbank
Columnstore der
In-Memory DB
Optimierende
Techniken
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
19
Database Smart Flash Cache ("Flash Cache“)
• Ab 11gR2
• Erweiterung des Datenbank Buffer Caches
– SSD ist wie ein Level 2 Cache (SGA ist Level 1)
SGA Memory (Level 1)
Flash Cache (Level 2)
• Schneller als Platte (100x faster for reads)
• Günstiger als Memory
• Größere Kapazität
– Read-only Overflow für DB Block Buffers
Disks (NAS/SAN)
• Flash Disks werden (normalerweise) von einer Instanz exklusiv genutzt
– Ausnahme ODA: „Shared Flash Cache“
• Verfügbar auf Linux und Solaris Plattformen
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Nutzung des Database Flash Cache
• Init-Parameter einstellen
– db_flash_cache_file = {OS-Pfad zur Flash Disk}
– db_flash_cache_size = {Größe der Flash Disk}
Flash Cache (Level 2)
• Strategien zum Pinnen von Objekten im Flash Cache
ALTER TABLE/INDEX name STORAGE (flash_cache KEEP));
• Zusätzlicher SGA-Bedarf für Metadaten-Verwaltung
– Pro Datenbank-Block 100 Byte; auf RAC-Systemen 200 Byte
• Optimizing Oracle Database Performance on Oracle Linux with Flash
http://www.oracle.com/us/technologies/linux/oracle-linux-with-flash-2004731.pdf
• How To Size the Database Smart Flash Cache (Doc ID 1317950.1)
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Database Buffer
Shared Pool
Plattformspezifisch
(Engineered Systems)
Result Cache
Server- /Clientside
Memory für die
Oracle
Datenbank
2nd
Level Cache
Columnstore der
In-Memory DB
Optimierende
Techniken
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
22
Query und PL/SQL Result Caches
• Eigener Cache im Shared Pool
• Einfache Form des Tunings für
– SQL-Abfragen
– PL/SQL-Funktionen
• Gedacht für:
– Vorhersehbare Abfragen/sich wiederholende Abfragen
– Abfragen mit kleinen Ergebnismengen
– Langlaufende Abfragen mit teuren Berechnungen
• Automatischer Refresh bei Daten-Änderungen !
• Einfaches Setup und Monitoring der Cache-Nutzung
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Das Setup – ganz einfach
• Initialisierungsparameter
RESULT_CACHE_MAX_RESULT
RESULT_CACHE_MAX_SIZE
RESULT_CACHE_MODE
5 (%)
abh. von O/S
MANUAL/FORCE
RESULT_CACHE_REMOTE_EXPIRATION
0 (min)
• Session Parameter RESULT_CACHE_MODE
• Einstellung RESULT_CACHE in der Tabellendefinition
ALTER TABLE tabelle RESULT_CACHE (MODE FORCE);
• Über Hint RESULT_CACHE
SELECT /*+ RESULT_CACHE*/ * FROM tabelle;
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Result Cache: Query Hints
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Result Cache-Informationen in den Statistiken
Statistiken
---------------------------------------------------------0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
1304 bytes sent via SQL*Net to client
491 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Monitoring
• Ausführungspläne, set autotrace, Views, Package DBMS_RESULT_CACHE
SQL> SELECT name, type, row_count, status, invalidations, scan_count
2 FROM v$result_cache_objects order by 1;
NAME
-------------------------------------------------------------------------------TYPE
ROW_COUNT STATUS
INVALIDATIONS SCAN_COUNT
---------- ---------- --------- ------------- ---------"SH"."CACHED"::8."CACHED"#32fb3b6bdac49c05 #1
Result
1 Published
0
0
"SH"."CACHED"::8."CACHED"#32fb3b6bdac49c05 #1
Result
1 Invalid
0
6
SH.CACHED
Dependency
0 Published
0
0
SH.CUSTOMERS
Dependency
0 Published
0
0
SH.T
Dependency
0 Published
1
0
select /*+ result_cache */ count(*) from customers
Result
1 Published
0
1
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
PL/SQL Function Result Cache für Entwickler
• Result Cache für (cross session) PL/SQL Funktionen
– Häufige Ausführung
– Abhängig von Informationen, die sich selten ändern
• Ohne ...
CREATE OR REPLACE FUNCTION customer_sales
(cust_id_in IN number)
RETURN number
IS
• Mit ...
CREATE OR REPLACE FUNCTION customer_sales
(cust_id_in IN number)
RETURN number
result_cache
IS
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
PL/SQL Function Result Cache ... Bitte Beachten ...
• Nicht möglich in anonymen Blöcken und keine Pipelined Table Function
• Dictionary Tables, Temporary Tables, Sequences oder nondeterministic SQL
Functions sind nicht referenzierbar
• Enthält keine OUT oder IN OUT Parameter
• IN Parameter sind keine LOBs, REF CURSOR, Collections, Objekte oder Recs
• Der Return Typ ist kein LOB, REF CURSOR, Objekt oder Record
• Neuigkeiten ab 11gR2: kein RELIES_ON erforderlich
• Neuigkeit in 12c: Invoker Rights Funktionen für RESULT_CACHE
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Database Buffer
Plattformspezifisch
(Engineered Systems)
Shared Pool
Memory für die
Oracle
Datenbank
2nd
Level Cache
Columnstore
Row und Column In-Memory
Formate auf der selben Tabelle
Simultan und transaktionskonsistent
Optimierende
Techniken
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
30
Neue SGA Komponente: In-Memory Area
Shared Pool
Buffer Cache
Large Pool
ABTC
In-Memory Area
Flashback
Redo Log
Java
Pool
Fixed SGA
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
In-Memory Column Store – Kurzbeschreibung
Pure In-Memory Columnar
•
Reines In-Memory Format
•
Nutzung unterschiedlicher
Komprimierungsarten (2x - 20x)
• Einschaltbar auf Objektebene
=> Entscheidung des Users
• Automatisch
Transaktionskonsistent
SALES
• Statisch und damit kein LRU
• Verfügbar auf allen Plattformen
• Ab 12.1.0.2 mit Option
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Das duale Format in der Datenbank
Memory
Memory
SALES
SALES
Row
Format
Column
Format
• Beides: Row und Column InMemory Formate für die
gleiche Tabelle
• Real Time Analysen nutzen
das neue Column Format
• OLTP Applikationen nutzen
das Row Format
• Erhalt der
Transaktionskonsistenz
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Konfiguration in 2 Schritten – ganz einfach
1. Memory Allokation in der SGA über neuen Initialisierungsparameter
–
INMEMORY_SIZE
2. Auswahl der Objekte (Spalten, Tabellen/Partitionen, Materialized
Views, Tablespace) und Festlegung von Komprimierung und Priorität
CREATE TABLE
PARTITION BY
(PARTITION
(PARTITION
customers …
LIST
p1 … INMEMORY FOR QUERY LOW,
p2 … NO INMEMORY);
Hinweise:
- u.U. überflüssige analytische Indizes löschen!
- Nicht alle Objekte müssen im Column Store vorliegen!
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Wann geeignet, wann nicht?
• Abfragen können deutlich profitieren ...
– Scannen von vielen Zeilen und Anwendung von Filtern
(=, <, >, und IN etc.)
– Abfragen mit Operationen (min, max, sum, distinct etc.)
– Abfragen einer Teilmenge von Spalten einer Tabelle (5 von 100 Spalten)
– Joins von kleinen Tabellen mit einer großen Tabelle mit Filterung von vielen Zeilen
⇒ Optimizer entscheidet mit zusätzlichen neuen Optimizerzugriffen
• Kein Einfluß auf ...
– Network round trips, logon/logoff, Parsing, PL/SQL …
– Komplexe Datenberechnungen (processing)
– Einmaliges Laden und Selektieren (Staging Tabellen, ETL, Temp Tables)
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Welche Objekte sind überhaupt geeignet?
• In-Memory Advisor
(Download von MOS)
• Analyse eines
existierenden DB
Workloads (AWR & ASH)
• Liefert Liste von
Objekten, die am
meisten vom
Columnstore profitieren
können
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Zusammenfassung
• Verschiedene Memory Technologien und Caches der Oracle-Datenbank
– Buffer Cache: KEEP und RECYCLE, Flash Cache, Result Cache, Column Store
• Mehrwert liegt in der Kombination der Technologien
– Aggregate auf normale, relationale Tabellen: In-Memory DB
– LOBs, JSON, XML, Geodaten: Buffer Cache KEEP Pool
– Query Result Cache
• Unbedingt auch weitere Tuning Techniken mitberücksichtigen
– Partitionierung, Statistikmanagement, SQL Plan Baseline etc.
• Erweitungen in 12c Release 2
Alles mit minimalem Einfluß auf die Applikation!
Copyright © 2014 Oracle and/or its affiliates. All rights reserved.
Herunterladen