اوراکل 23c – امکان استفاده از قابلیت Memoptimized Rowstore بدون تنظیم Hint

برای استفاده از قابلیت Memoptimized Rowstore در نسخه های 19c و 21c، ابتدا می بایست این قابلیت را در سطح جدول فعال می کردیم و بعد از آن، در زمان درج دیتا، Hintای را به دستور insert اضافه می کردیم با توجه به آنکه ممکن است application از قبل نوشته شده باشد، اضافه کردن Hint به دستور insert می تواند مانعی برای استفاده از قابلیت Memoptimized Rowstore شود.

SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE;
Table altered

SQL> INSERT /*+ MEMOPTIMIZE_WRITE */ INTO tbl1 VALUES (1,'usefzadeh.com');

بنابرین در نسخه های یاد شده، بدون استفاده از هینت MEMOPTIMIZE_WRITE امکان استفاده از این قابلیت وجود نداشت.

در نسخه 21c اوراکل پارامتری به نام MEMOPTIMIZE_WRITES را اضافه کرده است که از طریق آن می توان بدون تنظیم این Hint، از این قابلیت بهرمند شد:

SQL> show parameter memoptimize_writes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memoptimize_writes                   string      HINT

مقدار پیش فرض این پارامتر برابر با HINT است یعنی برای استفاده از این قابلیت، تنظیم هینت MEMOPTIMIZE_WRITE الزامی است و با تنظیم این پارامتر به مقدار ON، نیازی به استفاده از Hint نخواهد بود:

SQL> alter system set memoptimize_writes=ON scope=spfile;
System altered.

SQL> startup force;

پس از تنظیم این پارامتر، جدولی را ایجاد کرده و قابلیت MEMOPTIMIZE FOR WRITE را برای آن فعال می کنیم:

Connected to Oracle Database 23c Free, Release 23.0.0.0.0 
SQL> create table TBL1
  2  (
  3    id   NUMBER not null,
  4    text VARCHAR2(3000),
  5    mydate date
  6  )
  7  SEGMENT CREATION IMMEDIATE
  8  partition by range ( mydate )
  9  interval ( numtoyminterval(1,'MONTH'))
 10  (
 11   PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2015', 'DD-MM-YYYY'))
 12  );
Table created

SQL> ALTER TABLE tbl1 MEMOPTIMIZE FOR WRITE;
Table altered

رکوردی را در این جدول درج می کنیم:

SQL> insert into TBL1 values(1,'www.usefzadeh.com',sysdate);
1 row created.

SQL> commit;
Commit complete.

SQL> select * from TBL1;
no rows selected

دستور insert بدون خطا اجرا شد اما هنوز این رکورد در حافظه قرار دارد و به دیسک منتقل نشده است که این مسئله بیانگر فعال بودن قابلیت fast ingest است. برای انتقال رکورد به دیسک، باید مدت زمانی را منتظر بمانیم و یا دستور زیر را اجرا کنیم:

SQL> exec dbms_memoptimize_admin.writes_flush();
PL/SQL procedure successfully completed.

SQL>select * from TBL1;
ID TEXT                 MYDATE
--- -------------------- ---------
  1 www.usefzadeh.com    20-SEP-23

با برگرداندن تنظیمات(memoptimize_writes=HINT)، برای استفاده از این قابلیت باید از Hint استفاده کنیم:

SQL> alter system set memoptimize_writes=HINT scope=spfile;
System altered.

SQL> startup force;


SQL> truncate table tbl1;
Table truncated.

SQL> insert into TBL1 values(1,'www.usefzadeh.com',sysdate);
1 row created.

SQL>select * from TBL1;
ID TEXT                 MYDATE
--- -------------------- ---------
  1 www.usefzadeh.com    20-SEP-23



SQL> truncate table tbl1;
Table truncated.

SQL> insert /*+ MEMOPTIMIZE_WRITE */ into TBL1 values(1,'www.usefzadeh.com',sysdate);
1 row created.

SQL> select * from TBL1;
no rows selected

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *