External Table و In-Memory – اوراکل 18c

تا قبل از اوراکل 18c، امکان استفاده از قابلیت in memory برای جداول از نوع external وجود نداشت:

SQL*Plus: Release 12.2.0.1.0 Production on Mon May 18 12:05:36 2020

SQL> alter table mytbl inmemory;

ORA-30657: operation not supported on external organized table

این قابلیت در اوراکل 18c برای محیط exadata ارائه شد.

Connected to Oracle Database 18c Enterprise Edition Release 18.0.0.0.0

 SQL> alter table mytbl inmemory;

ORA-12755: Feature In-Memory External Tables is disabled due to unsupported capability.

SQL> alter system set “_exadata_feature_on”=true scope=spfile;

System altered.

SQL> startup force;

SQL> alter table mytbl inmemory;

Table altered

SQL> SELECT table_name, inmemory, inmemory_compression FROM user_external_tables;

TABLE_NAME   INMEMORY    INMEMORY_COMPRESSION

———–  ———  ———————-

MYTBL        ENABLED        FOR QUERY LOW

SQL> select OWNER,SEGMENT_NAME,INMEMORY_SIZE,BYTES,POPULATE_STATUS from v$im_segments;

no rows selected

SQL> EXEC dbms_inmemory.populate (‘USEF’,’MYTBL’);

PL/SQL procedure successfully completed.

SQL> select OWNER,SEGMENT_NAME,INMEMORY_SIZE,BYTES,POPULATE_STATUS from v$im_segments;

OWNER      SEGMENT_NAME      INMEMORY_SIZE    BYTES POPULATE_S

———- —————   ————-   —— ———-

USEF       MYTBL                1179648        0     COMPLETED

توجه: از طریق ستون v$im_segments.IS_EXTERNAL می توان جداول external موجود در in memory را شناسایی کرد:

SQL>select SEGMENT_NAME,INMEMORY_SIZE,BYTES_NOT_POPULATED,POPULATE_STATUS,IS_EXTERNAL from v$im_segments;

با مشاهده plan دستور زیر خواهیم دید که برای خواندن جدول mytbl کماکان از buffer cache استفاده می شود:

SQL> select count(*) from MYTBL;

برای استفاده از in memory باید پارامتر QUERY_REWRITE_INTEGRITY را به مقدار STALE_TOLERATED تنظیم کرد:

SQL> ALTER system SET QUERY_REWRITE_INTEGRITY = STALE_TOLERATED;

System altered

SQL> select count(*) from MYTBL;

پس از تغییر مقدار پارامتر QUERY_REWRITE_INTEGRITY با اضافه کردن رکورد به فایل منبع، اطلاعات به صورت خودکار به in memory منتقل نمی شوند:

SQL> select count(*) from MYTBL;

  COUNT(*)

———-

        75

[oracle@ol6 ~]$ echo “1,reza,rezai,0”>>data01.txt

[oracle@ol6 ~]$ echo “1,reza,rezai,0”>>data01.txt

[oracle@ol6 ~]$ echo “1,reza,rezai,0”>>data01.txt

SQL> select count(*) from MYTBL;

  COUNT(*)

———-

        75

راهکار حل این مسئله، بارگذاری مجدد جدول در in memory می باشد:

SQL> EXEC dbms_inmemory.repopulate (‘USEF’,’MYTBL’);

PL/SQL procedure successfully completed

SQL> select count(*) from MYTBL;

  COUNT(*)

———-

        78

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.