Oracle 11g Invisible Indexes

4
Invisible Indexes Bu yazimda 11g ile gelen yeni ozellik “"invisible index" ler uzerinde dayanacagam. Eger biz Index I invisibleye chekdiyimzde optimizer o index yoxmush kimi davranacaqdir. Diger terefden gelen insertlerde index update olmaya devam edecekdir. Yeni indexsi yeniden visible etdiyimizde indexsi rebuild etmeye gerek qalmayacaqdir. Bunu istifade ede bilmemiz uchun COMPATIBLE parametresi en az 11.0.0.0.0 olmalidir. Bele olmasa o zmana ashagdaki xetani alacaqsiniz. ORA-00406: COMPATIBLE parametresi 11.0.0.0.0 ve ya daha boyuk olmalıdır Oracle 11g Databaselerde optimizer_use_invisible_indexes parametresi default olarak FALSE gelir.Bu parameteni TRUE etdiyimizde optimizer invisible indexleri istifade edmeyecekdir. SQL> show parameter optimizer_use_invisible_indexes NAME TYPE VALUE ------------------------------------ ----------- optimizer_use_invisible_indexes boolean FALSE Misal uchun bir table ve index yaradaraq invisible index testi heyata kechirek. SQL> create table deneme as select * from dba_objects; Table created. SQL> CREATE INDEX indx_deneme_owner ON DENEME(OWNER); Index created. SQL> set autotrace traceonly SQL> select * from deneme where owner='ANAR'; Execution Plan --------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID| DENEME | |* 2 | INDEX RANGE SCAN | INDX_DENEME_OWNER | ---------------------------------------------------------

Transcript of Oracle 11g Invisible Indexes

Page 1: Oracle 11g Invisible Indexes

Invisible Indexes

Bu yazimda 11g ile gelen yeni ozellik “"invisible index" ler uzerinde dayanacagam. Eger biz

Index I invisibleye chekdiyimzde optimizer o index yoxmush kimi davranacaqdir. Diger

terefden gelen insertlerde index update olmaya devam edecekdir. Yeni indexsi yeniden

visible etdiyimizde indexsi rebuild etmeye gerek qalmayacaqdir.

Bunu istifade ede bilmemiz uchun COMPATIBLE parametresi en az 11.0.0.0.0 olmalidir.

Bele olmasa o zmana ashagdaki xetani alacaqsiniz.

ORA-00406: COMPATIBLE parametresi 11.0.0.0.0 ve ya daha boyuk olmalıdır

Oracle 11g Databaselerde optimizer_use_invisible_indexes parametresi default olarak FALSE

gelir.Bu parameteni TRUE etdiyimizde optimizer invisible indexleri istifade edmeyecekdir.

SQL> show parameter optimizer_use_invisible_indexes

NAME TYPE VALUE

------------------------------------ -----------

optimizer_use_invisible_indexes boolean FALSE

Misal uchun bir table ve index yaradaraq invisible index testi heyata kechirek.

SQL> create table deneme as select * from dba_objects;

Table created.

SQL> CREATE INDEX indx_deneme_owner ON DENEME(OWNER);

Index created.

SQL> set autotrace traceonly 

SQL> select * from deneme where owner='ANAR';

Execution Plan

---------------------------------------------------------

| Id | Operation | Name |

---------------------------------------------------------

| 0 | SELECT STATEMENT | |

| 1 | TABLE ACCESS BY INDEX ROWID| DENEME |

|* 2 | INDEX RANGE SCAN | INDX_DENEME_OWNER |

---------------------------------------------------------

SQL> set autotrace off;

Bu sorguda optimizer index istifade olundu.

Indi indexsimizi invisibla chekerek tekrar execution plani inceleyek.

Optimizer indexi gormezden gelerek table access full scan getmesini gozleyirik.

Page 2: Oracle 11g Invisible Indexes

SQL> alter index indx_deneme_owner invisible;

Index altered.

SQL> set autotrace traceonly

SQL> select * from deneme where owner='ANAR';

Execution Plan

------------------------------------

| Id | Operation | Name |

------------------------------------

| 0 | SELECT STATEMENT | |

|* 1 | TABLE ACCESS FULL| DENEME |

------------------------------------

SQL> set autotrace off

Gorduyumuz kimi optimizer indexi gormedi ve DENEME tablesine full access getdi.

Bu zaman bele bir sual ortaya chixir. Bir index invisible-dirsa update olunurmu? Gozel sual

Test uchun analiz tarixi ve setir sayisini inceleyek.

SQL> select num_rows,last_analyzed from dba_indexes where index_name

='INDX_DENEME_OWNER';

NUM_ROWS LAST_ANAL

---------- ---------

79051 12.03.2012 10:39:27

Analiz tarixi indexsin yaradilma tarihi

BU deqiqe indexsimiz invisibledir. Tablenin statistikasini alsqa bu zaman indexsimizin

statistikasida toplanacaqdir. 

SQL> exec

dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'DENEME',cascade=>

true);

PL/SQL procedure successfully completed.

SQL> select num_rows,last_analyzed from dba_indexes where index_name

='INDX_DENEME_OWNER';

NUM_ROWS LAST_ANAL

---------- ---------

79051 12.03.2012 10:41:03

Page 3: Oracle 11g Invisible Indexes

Yeniden analiz tarixine baxiriq ve bu anin tarixi oldugunu goruruk.

Demeli index invisible olsada  update olur. 

Birde tabeleye insert edek tekrar baxaq.

SQL> insert into deneme select * from dba_objects;

79052 rows created.

SQL> commit;

Commit complete.

SQL> exec dbms_stats.gather_index_stats('SYS','INDX_DENEME_OWNER');

PL/SQL procedure successfully completed.

SQL> select num_rows,last_analyzed from dba_indexes where

index_name ='INDX_DENEME_OWNER';

NUM_ROWS LAST_ANAL

---------- ---------

158103 12.03.2012 10:43:15

Burdan goruruk ki num_rows columumuzda artdi.

Indi tekrar visableye chekek. 

SQL> alter index indx_deneme_owner visible;

Index altered.

Indi Indesimiz istifade edile bilir ve herhansi bir index rebuild ishlemine ehtiyac yoxdur.

SQL> set autotrace traceonly

SQL> select * from deneme where owner='ANAR';

Execution Plan

---------------------------------------------------------

| Id | Operation | Name |

---------------------------------------------------------

| 0 | SELECT STATEMENT | |

| 1 | TABLE ACCESS BY INDEX ROWID| DENEME |

|* 2 | INDEX RANGE SCAN | INDX_DENEME_OWNER |

---------------------------------------------------------

SQL> set autotrace off

Birde optimizer_use_invisible_indexes parametresini test edek.

Ilk once indexsi visibleye chekek ardindan parametreni true edek.

Page 4: Oracle 11g Invisible Indexes

SQL> alter index indx_deneme_owner invisible;

Index altered.

SQL> set autotrace traceonly

SQL> select * from deneme where owner='ANAR';

------------------------------------

| Id | Operation | Name |

------------------------------------

| 0 | SELECT STATEMENT | |

|* 1 | TABLE ACCESS FULL| DENEME |

------------------------------------

Parametreni TRUEya chekdiyimizde artiq optimizer Invisible indexleri istifade etmeyecek.

SQL> alter session set optimizer_use_invisible_indexes=TRUE;

Session altered.

SQL> select * from deneme where owner='ANAR';

Execution Plan

---------------------------------------------------------

| Id | Operation | Name |

---------------------------------------------------------

| 0 | SELECT STATEMENT | |

| 1 | TABLE ACCESS BY INDEX ROWID| DENEME |

|* 2 | INDEX RANGE SCAN | INDX_DENEME_OWNER |

-------------------------