سه نمونه از محدودیتهای فیچر auto indexing در اوراکل 19c

auto indexing یکی از قابلیتهای مهم اوراکل نسخه 19c است که در مورد این قابلیت، پیشتر مطلبی را نوشتیم(ویژگی Automatic Indexing در اوراکل 19c). در این متن به برخی از محدودیتهای این قابلیت در نسخه 19c خواهیم پرداخت البته بسیار روشن است که در نسخه های آتی اوراکل ممکن است این محدودیتها  برطرف شود بنابرین باید توجه داشته باشید که سناریوهای موجود در متنی که در حال مطالعه آن هستید، در نسخه 19c(بطور دقیق تر 19cR8) تست شده است.

 

1.عدم پشتیبانی از شرط نامساوی

برای نمایش این محدودیت، جدولی را همراه با حجم قابل توجهی از اطلاعات ایجاد می کنیم:

SQL> create table tb(id number,name varchar2(100),date_time date,c1 varchar2(4000),c2 varchar2(4000));

Table created

SQL> insert into tb select rownum,’test’||”||rownum,sysdate – rownum,rpad(‘test’,400,’c1′),rpad(‘test’,400,’c2′) from dual connect by level <=666444;

666444 rows inserted

SQL> commit;

Commit complete

SQL> exec dbms_stats.gather_table_stats(ownname => user,tabname => ‘TB’);

PL/SQL procedure successfully completed

بعد از ایجاد جدول، پرس و جوی زیر را که شرط عدم تساوی در آن استفاده شده است را در دیتابیس اجرا می کنیم:

Select count(*) from tb where id between 1 and 10;

همچنین با اجرای بلاک plsql زیر، سعی در مجاب کردن اوراکل برای بررسی این پرس و جو داریم:

declare

  temp number;

begin

  for a in 1 .. 1000 loop

    select count(*) into temp from tb where id between 1 and 10;

  end loop;

end;

پس از گذشت interval پانزده دقیقه ای، گزارشی از آخرین اجرا را می بینیم:

select dbms_auto_index.report_last_activity() report from dual;

GENERAL INFORMATION

——————————

 Activity start               : 19-FEB-2021 00:53:48

 Activity end                 : 19-FEB-2021 00:53:52       

 Executions completed         : 1                   

 Executions interrupted       : 0                   

 Executions with fatal error  : 0                   

——————————-

SUMMARY (AUTO INDEXES)

———————-

 Index candidates            : 0  

 Indexes created             : 0  

 Space used                  : 0 B

 Indexes dropped             : 0  

دستور زیر هم تایید می کند که auto indexای برای این جدول ایجاد نشده است:

SQL> select owner,index_name,table_name,index_type,auto from dba_indexes where AUTO=’YES’;

no rows selected

البته با تغییر پرس و جو به صورت زیر، شرایط فرق خواهد کرد:

select   count(*) into temp  from tb where DATE_TIME >  sysdate -10 and id=1 ;

در این شرایط، اوراکل ایندکسی را برای ستون id ایجاد خواهد کرد:

با اجرای دستور زیر خواهیم دید که بر روی ستون id ایندکسی ایجاد شده است:

SQL> select index_name,column_name from dba_ind_columns p where p.table_name=’TB’;

INDEX_NAME                     COLUMN_NAM

—————————— ———-

SYS_AI_9qxxvpz1p5359           ID

 

2.عدم پشتیبانی از Function-Based Index

در نسخه 19c، اوراکل امکان ایجاد auto indexهای از نوع Function-Based را ندارد:

SQL> select count(*) from tb where upper(name)=’TEST1′;

  COUNT(*)

———-

         1

Executed in 2/05 seconds

SQL> /

  COUNT(*)

———-

         1

Executed in 2/066 seconds

 

SQL> /

  COUNT(*)

———-

         1

Executed in 2/056 seconds

با اجرای دستور زیر می بینیم که بصورت کلی، auto indexای در دیتابیس موجود نیست:

SQL> select owner,index_name,table_name,index_type,auto from dba_indexes where AUTO=’YES’;

no rows selected

 

3.عدم پشتیبانی از Global temp table

SQL> create global temporary table temptbl (id number,name varchar2(100),date_time date,c1 varchar2(4000),c2 varchar2(4000)) on commit preserve rows;

Table created

SQL> insert into temptbl select rownum,’test’||”||rownum,sysdate – rownum,rpad(‘test’,400,’c1′),rpad(‘test’,400,’c2′) from dual connect by level <=666444;

666444 rows inserted

SQL> select count(*) from tb where id=1;

در این شرایط هم فیچر auto indexing، ایندکسی را ایجاد نخواهد کرد:

 

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

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

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