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:
(
coluna1 number,
coluna2 number,
coluna3 number,
coluna4 number
);
Table created.
- Unique versus nonunique
SQL> create unique index tabela_teste_idx1 on tabela_teste(coluna1);
- Unique versus nonunique
Index created.
SQL> create unique index tabela_teste_idx1 on tabela_teste(coluna1);
SQL> create unique index tabela_teste_idx1 on tabela_teste(coluna1);
Index created.
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.
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.
SQL> ALTER INDEX tabela_teste_idx1 INVISIBLE;
Index altered.
SQL> ALTER INDEX tabela_teste_idx2 VISIBLE;
Index altered.
SQL> alter session set optimizer_use_invisible_indexes=true;
- B-tree versus bitmap
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)
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:
Index altered.
SQL> ALTER INDEX tabela_teste_idx2 VISIBLE;
Index altered.
Fazendo o
optimizador considerar os índices invisíveis:
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 |
---------------------------------------------------------------------------
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:
Postar um comentário