تا قبل از اوراکل 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