Performance-Optimierung mit Memory-Techniken 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. | ... in eigener Sache ... • Deutschsprachiger Community Blog – http://blogs.oracle.com/dbacommunity_deutsch • News für den DBA und Developer in 30 Minuten (Webcast) – http://tinyurl.com/oradba-monthly – http://tinyurl.com/oradev-monthly • Alle Events auf einen Blick – http://tinyurl.com/oraclebudb • Alle Dojos bestellen oder Herunterladen – http://tinyurl.com/dojoonline Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Result Cache Database Buffer Default Cache Keep/Recycle Cache LRU-Algorithmus Automatic Big Table Cache Shared Pool oder Client Transparent für Anwendungen In-Memory Exadata X4 Hybrid Columnar Compression Smart Scan Storage Index Smart Flash Cache (Read/Write) Smart Flash Logging (Redo-Write) Techniken der Flash Cache Datenbank Data Buffer Erweiterung 2nd level Cache Auch für Datafiles Memory optimierende Techniken Compression Partitioning Parallelisierung OLAP In-Memory Option 12c Row und Column In-Memory Formate auf der selben Tabelle Simultan und transaktionskonsistent Column: Analytics & Reporting Row : OLTP In-Memory Techniken der TimesTen IMDB Middle-Tier TimesTen Application-Tier Database Cache TimesTen for Exalytics Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Coherence Data Grid Object Cache / Data Grid für verteilte Anwendungen 3 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. Der Buffer Cache • Manuelle Konfiguration des (Default) Buffer Cache über Parameter 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 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. Pre-Loading der Objekte • Auslösen eines Objekt-Scans über die Tabelle, den Index, das Lobsegment • Prinzipiell eine 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 – 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. 1 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. 2 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 ab 12c) Copyright © 2014 Oracle and/or its affiliates. All rights reserved. • Monitoren 2 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. 2 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. 2 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 sind betroffen. • 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 • Empfehlung von Oracle: http://docs.oracle.com/database/121/CNCPT/memory.htm#CNCPT89659 Oracle recommends that you enable force full database caching mode only when the buffer cache size of each individual instance is greater than the database size. This guideline applies to both single-instance and Oracle RAC databases. However, when Oracle RAC applications are well partitioned, you can enable force full database caching mode when the combined buffer cache of all instances, with extra space to handle duplicate cached blocks between instances, is greater than the database size. • Force Full Database Caching aktivieren mit ... ALTER DATABASE MOUNT; ALTER DATABASE FORCE FULL DATABASE CACHING; • Full DB Caching wird auf Ebene der Container-Datenbank eingestellt – Alle Pluggable Databases betroffen Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Exkurs: Sogar PL/SQL Objekte "In-Memory" • PL/SQL-Objekte werden bei Nutzung in die SGA (Library Cache) geladen – Packages, Procedures, Functions, Type Bodys, Trigger; nicht für Tabellen und Views – Auch hier LRU Algorithmus – Einfluß auf PL/SQL Performance • Möglichkeiten, Empfehlungen, Tipps ... – Packages anstelle von einzelnen Procedures und Functions – Library Cache groß genug dimensionieren – Einzelne Objekte/Cursor pinnen mit DBMS_SHARED_POOL.KEEP execute dbms_shared_pool.keep(name=> 'scott.hispackage', flag => 'P'); execute dbms_shared_pool.keep(name=> '4158E358 2329752635', flag=> 'C'); Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Result Cache Database Buffer Default Cache Keep/Recycle Cache LRU-Algorithmus Automatic Big Table Cache Shared Pool oder Client Transparent für Anwendungen In-Memory Exadata X4 Hybrid Columnar Compression Smart Scan Storage Index Smart Flash Cache (Read/Write) Smart Flash Logging (Redo-Write) Techniken der Flash Cache Datenbank Data Buffer Erweiterung 2nd level Cache Auch für Datafiles Memory optimierende Techniken Compression Partitioning Parallelisierung OLAP In-Memory Option 12c Row und Column In-Memory Formate auf der selben Tabelle Simultan und transaktionskonsistent Column: Analytics & Reporting Row : OLTP In-Memory Techniken der TimesTen IMDB Middle-Tier TimesTen Application-Tier Database Cache TimesTen for Exalytics Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Coherence Data Grid Object Cache / Data Grid für verteilte Anwendungen 18 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. Result Cache Database Buffer Default Cache Keep/Recycle Cache LRU-Algorithmus Automatic Big Table Cache Shared Pool oder Client Transparent für Anwendungen In-Memory Exadata X4 Hybrid Columnar Compression Smart Scan Storage Index Smart Flash Cache (Read/Write) Smart Flash Logging (Redo-Write) Techniken der Flash Cache Datenbank Data Buffer Erweiterung 2nd level Cache Auch für Datafiles Memory optimierende Techniken Compression Partitioning Parallelisierung OLAP In-Memory Option 12c Row und Column In-Memory Formate auf der selben Tabelle Simultan und transaktionskonsistent Column: Analytics & Reporting Row : OLTP In-Memory Techniken der TimesTen IMDB Middle-Tier TimesTen Application-Tier Database Cache TimesTen for Exalytics Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Coherence Data Grid Object Cache / Data Grid für verteilte Anwendungen 21 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 RESULT_CACHE_REMOTE_EXPIRATION 5 (%) abh. von O/S MANUAL/FORCE 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. Query Result Cache: Ein Beispiel SELECT a.department_id "Department", a.num_emp/b.total_count "%_Employees", a.sal_sum/b.total_sal "%_Salary" FROM ( SELECT department_id, COUNT(*) num_emp, SUM(salary) sal_sum FROM employees GROUP BY department_id ) a, ( SELECT COUNT(*) total_count, SUM(salary) total_sal FROM employees ) b ORDER BY a.department_id; 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. Result Cache: Query Hints Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Result Cache-Informationen im Ausführungsplan Result Cache Information (identified by operation id): -----------------------------------------------------1 - column-count=3; dependencies=(HR.EMPLOYEES); name="SELECT /*+ result_cache */ a.department_id "Department",a.num_emp/b.total_count "%_Employees", a.sal_sum/b.total_sal "%_S" 5 - column-count=2; dependencies=(HR.EMPLOYEES); attributes=(single-row); name="SELECT /*+ result_cache */ COUNT(*) total_count, SUM(salary) total_sal FROM employees" 9 - column-count=3; dependencies=(HR.EMPLOYEES); name="SELECT /*+ result_cache */ department_id, COUNT(*) num_emp, SUM(salary) sal_sum FROM employees Copyright © 2014 Oracle and/or its affiliates. All rights reserved. PL/SQL Result Cache • Result Cache für PL/SQL Function Results – Aktiv, wenn PL/SQL-Funktionen von PL/SQL aus aufgerufen werden CREATE OR REPLACE FUNCTION get_datum ( p_id NUMBER, p_format VARCHAR2 ) RETURN VARCHAR2 RESULT_CACHE IS v_datum DATE; BEGIN select hiredate into v_datum from emp where empno = p_id; RETURN TO_CHAR(v_datum, p_format); END; http://www.oracle.com/global/de/community/tipps/resultcache/index.html Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Result Cache Database Buffer Default Cache Keep/Recycle Cache LRU-Algorithmus Automatic Big Table Cache Shared Pool oder Client Transparent für Anwendungen In-Memory Exadata X4 Hybrid Columnar Compression Smart Scan Storage Index Smart Flash Cache (Read/Write) Smart Flash Logging (Redo-Write) Techniken der Flash Cache Datenbank Data Buffer Erweiterung 2nd level Cache Auch für Datafiles Memory optimierende Techniken Compression Partitioning Parallelisierung OLAP In-Memory Option 12c Row und Column In-Memory Formate auf der selben Tabelle Simultan und transaktionskonsistent Column: Analytics & Reporting Row : OLTP In-Memory Techniken der TimesTen IMDB Middle-Tier TimesTen Application-Tier Database Cache TimesTen for Exalytics Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Coherence Data Grid Object Cache / Data Grid für verteilte Anwendungen 29 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 • Verfügbar auf allen Plattformen • Voraussetzungen SALES – Datenbank Release 12.1.0.2 – Manuelle Aktivierung – Gebunden an In-Memory Option Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Buffer Cache versus In-Memory Column Store? SELECT column4 FROM mytable; RESULT RESULT Mit Buffer Cache Buffer Cache Mit Column Store IM Column Store X X X X X Row Format Column Format Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Prinzipielle Unterschiede zum (traditionellen) Buffer Cache • Der Column Store ist statisch und folgt nicht LRU (Least Recently Used) A. • Der Column Store ist geeignet für einheitliche Zugriffe (alle Zeilen einer Tabelle) => typisch für analytische Abfragen – Scannen von vielen Zeilen und Anwendung von Filtern wie z.B. =, <, >, und IN 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 – Abfragen mit Operationen wie min, max und sum, group by, distinct etc. • Der Buffer Cache hingegen ist vorgesehen für nicht einheitliche Zugriffe (z.B. einige Zeilen einer Tabelle) => typisch für OLTP • Der Column Store ist mit zusätzlichen neuen Optimizerzugriffen und Komprimierungsalgorithmen ausgestattet 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 In-Memory 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 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. Monitoring von In-Memory Scans im Ausführungsplan • Beispiel: Schlüsselwort INMEMORY FULL SQL> select * from table(dbms_xplan.display_cursor(format=>'BASIC')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------EXPLAINED SQL STATEMENT: -----------------------select count(*) from customers_mem where cust_gender='F' Plan hash value: 1973973873 ----------------------------------------------------| Id | Operation | Name | ----------------------------------------------------| 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | | 2 | TABLE ACCESS INMEMORY FULL| CUSTOMERS_MEM | ----------------------------------------------------- Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Public In-Memory Heat Map im Enterprise Manager Copyright © 2014 Oracle and/or its affiliates. All rights reserved. Fazit • 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, Plan Baseline, Result Cache etc. Alles mit minimalem Einfluß auf die Applikation! Copyright © 2014 Oracle and/or its affiliates. All rights reserved.