برای استفاده از قابلیت 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