18c: In-Memory External Tables

In Oracle Datenbank 18c gibt es einige interessante Neuerungen zum Thema External Tables. Beispielsweise gibt es die Möglichkeit Inline External Tables zu nutzen. Dies haben wir schon einige Wochen zuvor in unserem Blogeintrag zum Thema Inline External Tables (siehe Link zum Blogeintrag) beschrieben. Darüberhinaus ist es mit 18c jetzt auch möglich, External Table Informationen in Verbindung mit dem In-Memory Column Store zu verwenden. So können Daten, die in externen Dateien vorliegen, in diesen im Hauptspeicher befindlichen Column Store geladen werden, um damit alle Vorteile der In-Memory Funktionen (wie zum Beispiel Performance Steigerung beim Zugriff) nutzen zu können.

Um diese Funktionalität einzusetzen sind nur einige wenige Vorbereitungen erforderlich. Die folgenden Beispiele zeigen die Verwendung und demonstrieren den Einsatz mit einigen Code Beispielen. Wir verwenden dazu eine Oracle Database Cloud Service Enterprise Edition - High Performance.

Zuerst überprüfen wir die In-Memory Einstellungen. Man kann leicht feststellen, dass 480 MB In-Memory Column Store eingerichtet worden sind.

  
SQL> show sga
Total System Global Area 2483026344 bytes
Fixed Size                  8898984 bytes
Variable Size             520093696 bytes
Database Buffers         1375731712 bytes
Redo Buffers               74985472 bytes
In-Memory Area            503316480 bytes

SQL>  show parameter inmemory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_size                        big integer 480M

Im Moment wird der In-Memory Column Store noch nicht verwendet, wie eine einfache Abfrage beweist.

SQL> SELECT v.owner, v.segment_name name, v.populate_status status 
     FROM v$im_segments v;

no rows selected

Möchte man External Tables mit dem In-Memory Column Store verwenden, muss das Schlüsselwort INMEMORY zum CREATE TABLE oder ALTER TABLE Statement hinzugefügt werden. Wir nutzen in unserem Beispiel die Directory Information und die Daten aus dem letzten Blogeintrag zum Thema External Tables (siehe Blogeintrag). Das Directory hat den Namen HOME_DIR und die Informationen befinden sich in der Datei 'employees.csv'. Wichtige Voraussetzung ist, dass der Initialisierungsparameter QUERY_REWRITE_INTEGRITY auf stale_tolerated gesetzt ist.

SQL> alter system set QUERY_REWRITE_INTEGRITY=stale_tolerated;

SQL> CREATE TABLE sales_ext_inmem 
             (first_name       varchar2(30),
              last_name        varchar2(30),
              hiredate  date,
              department_name  varchar2(30),
              city             varchar2(30),
              street_address   varchar2(30))
              ORGANIZATION EXTERNAL 
             (TYPE ORACLE_LOADER
             DEFAULT DIRECTORY home_dir
             ACCESS PARAMETERS (
             RECORDS DELIMITED BY NEWLINE nobadfile nologfile
             fields date_format date mask "dd.mm.yy")
             LOCATION ('employees.csv'))  REJECT LIMIT UNLIMITED 
             INMEMORY;
Table created.

Beim Zugriff kann man erkennen, dass es sich aktuell um 106 Einträge handelt.

SQL> select count(*) from sales_ext_inmem;

  COUNT(*)
----------
       106

Überprüfen lassen sich die External Table Einstellungen beispielsweise in der View USER_EXTERNAL_TABLES.

SQL> SELECT  table_name, inmemory, inmemory_compression
     FROM user_external_tables;

TABLE_NAME      INMEMORY INMEMORY_COMPRESS
--------------- -------- -----------------
SALES_EXT_INMEM ENABLED  FOR QUERY LOW

Um den Column Store mit Daten zu befüllen, ist der manuelle Schritt über das Package DBMS_INMEMORY.POPULATE erforderlich. Ein Full Table Scan - wie bei "internen" Tabellen - ist im Fall von externen Tabellen nicht ausreichend um den Column Store mit den Daten anzureichern. Übrigens ist jedes Mal wenn sich die Daten ändern eine Ausführung von DBMS_INMEMORY.REPOPULATE erforderlich.

SQL> EXEC DBMS_INMEMORY.POPULATE('SCOTT', 'SALES_EXT_INMEM');

PL/SQL procedure successfully completed.

SQL> SELECT v.owner, v.segment_name name, v.populate_status status 
     FROM v$im_segments v;

OWNER      NAME                 STATUS
---------- -------------------- -------------
SCOTT      SALES_EXT_INMEM      COMPLETED

Nun führen wir erneut eine Abfrage durch und überprüfen, ob der Column Store verwendet wird.

SQL> select count(*) from sales_ext_inmem;

  COUNT(*)
----------
       106

SQL> SELECT * FROM dbms_xplan.display_cursor(format=>'BASIC');

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
EXPLAINED SQL STATEMENT:
------------------------
select count(*) from sales_ext_inmem

Plan hash value: 427401744
----------------------------------------------------------------
| Id  | Operation                            | Name            |
----------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                 |
|   1 |  SORT AGGREGATE                      |                 |
|   2 |   EXTERNAL TABLE ACCESS INMEMORY FULL| SALES_EXT_INMEM |
----------------------------------------------------------------

Nun erweitern wir unsere Datei um eine weitere Zeile. Dazu fügen wir über Betriebsystemmittel einen weiteren Eintrag hinzu. Beim Überprüfen der Anzahl der Zeilen stellen wir die Änderung erst nach einem erfolgreichen DBMS_INMEMORY.REPOPULATE fest.

SQL> select count(*) from sales_ext_inmem;

  COUNT(*)
----------
       106

SQL> EXEC DBMS_INMEMORY.REPOPULATE('SCOTT', 'SALES_EXT_INMEM');

PL/SQL procedure successfully completed.

SQL> select count(*) from sales_ext_inmem;

  COUNT(*)
----------
       107

Bitte beachten Sie, dass es im Moment noch Einschränkungen bei der Verwendung gibt. So sind folgende Funktionen in Verwendung mit In-Memory External Tables nicht möglich:

  • Parallelisierung
  • Partitionierung
  • In-Memory auf Spalten Ebene
  • HIVE/HDFS Support

Lizenzierung

Das Feature In-Memory Column Store für External Tables ist auf Exadata und den Oracle Database Cloud Service Enterprise Editionen - High Performance und Extreme Performance verfügbar. Genaueres kann man im Handbuch Licensing Information User Manual nachlesen.

Weitere Informationen

 

Zurück zur Community-Seite
 

Visit the Oracle Blog

 

Contact Us

Oracle

Integrated Cloud Applications & Platform Services