زمانی که INMEMORY را در سطح column فعال می کنیم، صرفا پرس و جوهایی که به ستونهای INMEMORY جدول رجوع می کنند، از In-Memory scan بهره خواهند برد و اگر در یک پرس و جو به هیچ یک از ستونهای In-Memory رجوع نشود، اوراکل بصورت ROW-STORE access به این پرس و جو پاسخ خواهد داد.
حالت دیگری هم در اینجا قابل تصور است! اگر پرس و جویی به صورت ترکیبی،به ستونهای INMEMORY و NO INMEMORY رجوع کند، اوراکل چه نوع scanای را انتخاب خواهد کرد؟
تا قبل از نسخه 21c، اوراکل برای این دسته از پرس و جوها، به In-Memory رجوع نمی کرد و با رجوع به buffer cache و بصورت row-store access به این پرس و جوها پاسخ می داد.
اما در اوراکل 21c، قابلیت جدیدی به نام In-Memory Hybrid Scan ارائه شد که بر اساس آن، اگر برای همه ستونهایی که در قسمت where clause دستور استفاده شدند، خصیصه INMEMORY فعال شده باشد(و علاوه بر آن، ستون NO INMEMORY در select list موجود باشد) اوراکل میتواند به صورت ترکیبی از هر دو scan( یعنی row store scan و in-memory scan) استفاده کند. به این شیوه از scan، اصطلاحا In-Memory Hybrid Scan گفته می شود.
مثال: شرایط زیر را در نظر بگیرید:
–Oracle 19c and 21c:
SQL> create table jadval_test(col1 number(9),col2 number(9),col3 number(9),col4 number(9));
Table created
SQL> insert into jadval_test select 1+level,1000+level,500+level,4000+level from dual connect by level<10000000;
9999999 rows inserted
SQL> commit;
Commit complete
SQL> ALTER TABLE jadval_test INMEMORY (col1,col2);
Table altered
SQL> ALTER TABLE jadval_test INMEMORY no inmemory (col3,col4);
Table altered
SQL> SELECT column_name, inmemory_compression FROM v$im_column_level im, user_objects o
2 WHERE im.obj_num = o.object_id
3 AND o.object_name=’JADVAL_TEST’;
COLUMN_NAME INMEMORY_COMPRESSION
————- ————————–
COL1 DEFAULT
COL2 DEFAULT
COL3 NO INMEMORY
COL4 NO INMEMORY
با استفاده از این محیط و با ارائه چهار مثال بیشتر با قابلیت In-Memory Hybrid Scan آشنا خواهیم شد.
مثال 1: اجرای پرس و جوی زیر در هر کدام از نسخه های اوراکل، منجر به row store scan خواهد شد چراکه برای ستونهای COL3 و COL4 خصیصه INMEMORY تنظیم نشده است
SQL> set autotrace traceonly explain
SQL> select col3 from usef.jadval_test where col4 =7890;
–19c
–21c
مثال 2: در پرس و جوی زیر هم با توجه به آنکه از ستون COL4 در where clause استفاده شده، حتی در نسخه 21c هم از In-Memory scan استفاده نمی شود:
SQL> select col2 from usef.jadval_test where col4 =7890 and col1=3891;
–19c
–21c
مثال 3: اوراکل 21c برای اجرای پرس و جوی زیر از In-Memory Hybrid Scan استفاده خواهد کرد چرا که در قسمت where clause این پرس و جو صرفا به ستونهای INMEMORY رجوع شده و علاوه بر آن، ستونی با خصیصه NO INMEMORY در select list وجود دارد:
SQL> select * from usef.jadval_test where col1=3891 and col2=4890;
–19c
–21c
مثال 4: در شرایط زیر هم اوراکل صرفا از In-Memory Scan استفاده خواهد کرد:
SQL> select col1 from usef.jadval_test where col1=3891 and col2=4890;
–19c
–21c