همانطور که می دانید، objectهای که خصیصه inmemory برای انها تنظیم شده متناسب با اولویتی که دارند، در in-memory قرار خواهند گرفت برای مثال، اگر خصیصه inmemory برای جدولی با اولویت critical تعریف شده باشد، این جدول صرف نظر از تعداد دفعات رجوع، در زمان استارت دیتابیس در in memory قرار خواهد گرفت.
در این متن به این سوال پاسخ خواهیم داد که چگونه می توان از قرار گرفتن جدول و یا به صورت کلی objectای که مدت زمان زیادی از آخرین زمان دستیابی و یا اصلاح آن گذشته، به in-memory جلوگیری کرد(آن هم به صورت خودکار)؟
این کار در نسخه 12cR2 با کمک ویژگی (Automatic Data Optimization(ADO قابل انجام است همانطور که می دانید ADO که در نسخه 12cR1 ارائه شد، امکان جابجایی و فشرده سازی objectها را متناسب با آمارهای heat map فراهم می سازد. به عنوان بهبودی جدید در نسخه 12cR2، امکان ایجاد ADO policy برای خصیصه inmemory جداول هم امکان پذیر می باشد(در سطح segment).
توجه: برای استفاده از این قابلیت، باید پارامتر HEAT_MAP را به مقدار ON تنظیم کرد.
ADO سه پالیسی اختصاصی را برای in-memory اضافه کرده که در قسمت زیر با هر یک از این ADO policyهای جدید آشنا خواهیم شد:
(INMEMORY(SET INMEMORY: با کمک این نوع از پالیسی، می توان خصیصه inmemory را برای objectای تنظیم کرد.
(Recompression(MODIFY INMEMORY: این پالیسی سطح فشرده سازی در inmemory را برای یک object تغییر خواهد داد.
(NO INMEMORY(NO INMEMORY: از طریق این پالیسی می توان خصیصه inmemory را برای یک segment غیرفعال کرد.
راستی سه پالیسی فوق در چه شرایطی اعمال می شوند؟ هر یک از این پالیسیها را می توان بر اساس شرایط زیر تنظیم کرد:
–زمان ایجاد شی(AFTER n DAYS OF CREATION)
زمان ایجاد شی را می توان با کمک مقدار ستون CREATED از ویوی DBA_OBJECTS مشخص کرد.
–اخرین زمان اصلاح شی(AFTER n DAYS OF NO MODIFICATION)
زمان آخرین اصلاح یک شی را می توان با کمک ستون SEGMENT_WRITE_TIME از ویوی DBA_HEAT_MAP_SEGMENT تعیین نمود.
–آخرین زمان رجوع به شی(AFTER n DAYS OF NO ACCESS)
زمان آخرین رجوع به یک شی را می توان با کمک ستونهای SEGMENT_WRITE_TIME، FULL_SCAN، LOOKUP_SCAN از ویوی DBA_HEAT_MAP_SEGMENT مشخص کرد.
در ادامه با ارائه دو مثال، ADO policyای را با شرایط گفته شده ایجاد خواهیم کرد. البته قبل از آن، محیط تست را برای ارائه مثال آماده می کنیم:
Connected to Oracle Database 19c Enterprise Edition Release 19.0.0.0.0
SQL> alter system set HEAT_MAP=on;
System altered
SQL> alter system set inmemory_size=1g scope=spfile;
System altered
SQL> CREATE TABLE person( label VARCHAR2(30), name VARCHAR2(30))
2 PARTITION BY LIST (label)
3 AUTOMATIC
4 (PARTITION p1 VALUES (‘A’),
5 PARTITION p2 VALUES (‘B’)
6 );
Table created
SQL> insert into person values(‘A’,’hadi’);
1 row inserted
SQL> insert into person values(‘B’,’ali’);
1 row inserted
SQL> commit;
Commit complete
SQL> alter table person inmemory MEMCOMPRESS for Query Low;
Table altered
SQL> select partition_name,inmemory,inmemory_compression from dba_tab_partitions where table_name=’PERSON’;
PARTITION_NAME INMEMORY INMEMORY_COMPRESS
——————– ——– —————–
P1 ENABLED FOR QUERY LOW
P2 ENABLED FOR QUERY LOW
SQL> select p.SEGMENT_NAME,p.PARTITION_NAME,p.SEGMENT_TYPE from v$im_segments p;
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
——————– ——————– ——————
PERSON P2 TABLE PARTITION
PERSON P1 TABLE PARTITION
مثال 1: در صورتی که آخرین زمان اصلاح هر کدام از پارتیشنهای جدول person از 120 روز بیشتر شد، خصیصه inmemory برای ان پارتیشن غیر فعال شود.
با توجه به آنکه 120 روز!!!! زمان نسبتا زیادی است و برای نوشتن این مطلب نمی توانیم تا این اندازه صبر کنیم، پس واحد زمانی ADO policy را در ابتدا از روز به ثانیه تغییر می دهیم:
SQL> EXEC dbms_ilm_admin.customize_ilm(dbms_ilm_admin.POLICY_TIME,dbms_ilm_admin.ILM_POLICY_IN_SECONDS);
PL/SQL procedure successfully completed
SQL> select * from DBA_ILMPARAMETERS p where p.NAME=’POLICY TIME’;
NAME VALUE
————- ——-
POLICY TIME 1
***مقدار 1 برای POLICY TIME به معنی ثانیه می باشد و عدد 0 هم بیانگر روز خواهد بود.
با دستور زیر، ADO policy را به جدول person اضافه می کنیم:
SQL> ALTER TABLE person ILM ADD POLICY NO INMEMORY SEGMENT AFTER 120 DAYS OF NO MODIFICATION;
Table altered
SQL>select * from USER_ILMOBJECTS ;
SQL> select * from USER_ILMDATAMOVEMENTPOLICIES ;
پس از انکه ADO Policy فوق(p201) را به جدول person اضافه کردیم، پروسیجر dbms_ilm.execute_ILM را به صورت دستی اجرا می کنیم(این پروسیجر به صورت خودکار همراه با maintenance window اجرا خواهد شد).
اجرای این پروسیجر سبب خواهد شد تا در صورت عدم انجام عملیات DMLای بر روی هر کدام از پارتیشنهای جدول person(به مدت 120 ثانیه گذشته)، خصیصه in memory برای پارتیشن مورد نظر برداشته خواهد شد:
SQL> update person set name=’dddd’ where label=’A’;
1 row updated
SQL> EXEC dbms_ilm.flush_all_segments;
PL/SQL procedure successfully completed
SQL> DECLARE
2 v_executionid number;
3 BEGIN
4 dbms_ilm.execute_ILM (ILM_SCOPE => dbms_ilm.SCOPE_SCHEMA,
5 execution_mode => dbms_ilm.ilm_execution_offline,
6 task_id => v_executionid);
7 END;
8 /
PL/SQL procedure successfully completed
SQL> select * from user_ilmevaluationdetails;
SQL>select * from USER_ILMOBJECTS ;
SQL> select partition_name,inmemory,inmemory_compression from dba_tab_partitions where table_name=’PERSON’;
PARTITION_NAME INMEMORY INMEMORY_COMPRESSION
—————- ——– ——————–
P1 ENABLED NO MEMCOMPRESS
P2 DISABLED
با اضافه شدن پارتیشن جدید به جدول person، این پالیسی به پارتیشن جدید هم اعمال خواهد شد:
SQL>select * from USER_ILMOBJECTS ;
پ.ن: برای حذف policy ایجاد شده می توان از دستور زیر استفاده کرد:
SQL> ALTER TABLE person ILM DELETE_ALL;
Table altered
مثال 2: پارتیشنهای جدول person به مدت 50 روز بعد از ایجاد، بصورت فشرده(Memcompress for Capacity High ) در in memory قرار بگیرند:
SQL> ALTER TABLE person ILM ADD POLICY MODIFY INMEMORY Memcompress for Capacity High SEGMENT AFTER 50 DAYS OF CREATION;
Table altered
Comments (3)