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، ایندکسی را ایجاد نخواهد کرد:
Comment (1)