ADO و مدیریت in-memory

همانطور که می دانید، 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

 

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

Comments (2)

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

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