12c - Multiple Indexes on the same set of Columns

Antes do Oracle Database 12c, ao tentar criar um índice para uma coluna ou lista de colunas já indexada, ocorria o erro ORA-01408: such column list already indexed error.

Uma das novas features do 12c, é a capacidade de ter vários índices em uma mesma coluna ou lista de colunas.

A criação de um índice sobre uma coluna ou lista de colunas que já foram indexadas é simples e você tem que garantir que apenas um índice será visível.

Se o índice já criado é visible, então você terá que usar a palavra-chave invisible para a criação do novo índice.

Algumas razões para a utilização desse novo recurso:


SQL> create table tabela_teste
(
coluna1 number,
coluna2 number,
coluna3 number,
coluna4 number
); 


Table created.

- Unique versus nonunique

SQL> create unique index tabela_teste_idx1 on tabela_teste(coluna1);
Index created.

SQL> create unique index tabela_teste_idx1 on tabela_teste(coluna1);

Index created.


 - B-tree versus bitmap

SQL> create index tabela_teste_idx3 on tabela_teste(coluna2);
Index created.

SQL> create bitmap index tabela_teste_idx4 on tabela_teste(coluna2) invisible;
Index created.


  - Different partitioning strategies:
      - Indexes that are not partitioned and indexes that are partitioned
      - Indexes that are locally partitioned and indexes that are globally partitioned
      - Indexes that differ in partitioning type (range or hash)


SQL> create index tabela_teste_idx5 on tabela_teste(coluna3, coluna4)
global partition by range(coluna3, coluna4)
(partition part1 values less than(100, 200),
partition part2 values less than(maxvalue, maxvalue)); 2 3 4

Index created.

SQL> create index tabela_teste_idx6 on tabela_teste(coluna3, coluna4)
global partition by hash(coluna3, coluna4)
partitions 10 invisible; 2 3

Index created.


Modificando qual índice está visível:

SQL> ALTER INDEX tabela_teste_idx1 INVISIBLE;

Index altered.

SQL> ALTER INDEX tabela_teste_idx2 VISIBLE;

Index altered.


Fazendo o optimizador considerar os índices invisíveis:

SQL> alter session set optimizer_use_invisible_indexes=true;
Session altered.


SQL> select count(*) from tabela_teste;

Execution Plan
----------------------------------------------------------
Plan hash value: 3185905804

--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)|
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 0 (0)|
| 1 | SORT AGGREGATE | | 1 | |
| 2 | BITMAP CONVERSION COUNT | | 1 | |
| 3 | BITMAP INDEX FAST FULL SCAN| TABELA_TESTE_IDX4 | | |
--------------------------------------------------------------------------------



SQL> alter session set optimizer_use_invisible_indexes=false;
Session altered.

SQL> select count(*) from tabela_teste;

Execution Plan
----------------------------------------------------------
Plan hash value: 1737391099

---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TABELA_TESTE | 1 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------





Referências:



Abraço


Alex Zaballa

0 comentários: