em funcao (Function-Based Index):Existem varios tipos de indices que voce pode criar para varias situacoes. Neste caso voce pode criar um indice baseado em funcao (FUNCTION BASED INDEX) que ira gerar dados no indice de acordo com uma funcao, mesmo que os dados nao estejam (ou nao existam) na origem (coluna ou colunas). Se criarmos um indice desse tipo usando a funcao NVL, o valor NULO sera substituido pelo valor arbitrario informado. Vamos explicar melhor. Veja primeiro o exemplo de uso da funcao NVL:SELECT nome,NVL(telefone,'SEM TELEFONE') FROM tb_alunos;Nessa consulta, todos os alunos que nao possuirem dados na coluna TELEFONE, ou seja, que nao possuirem telefone cadastrado, ao inves de nao aparecer valor, vai aparecer "SEM TELEFONE" no resultado da consulta:NOME TELEFONE--------- -------------Fernando 98989898Renato 78787878Natalia SEM TELEFONEHamilton 45454545Ou seja, a funcao NLV substituiu o valor NULO por um texto especifico durante a execucao. Claro que esse texto e apenas ilustrativo, ou seja, so aparece quando consultamos os dados. Nao estamos alterando a tabela, apenas a forma de visualizar o resultado. Isso que o comando SELECT faz, consultas.Agora vamos misturar a funcao com o indice criando um FUNCTION-BASED INDEX para usa-lo depois em uma consulta:CREATE INDEX idx_alunos_nvltelefone ON tb_alunos(NVL(telefone,0));Esse indice sera criado um pouco diferente do indice comum. Ao inves de nao criar valores nulos, ele ira criar valores "0" onde existirem NULOS (valores arbitrarios). Assim a consulta abaixo utilizara este indice ao inves de realizar um FTS:SELECT * FROM tb_alunos WHERE NVL(telefone,0)=0;------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 32 | 1376 | 19 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| TB_ALUNOS | 32 | 1376 | 19 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | IDX_ALUNOS_NVLTELEFONE | 32 | | 3 (0)| 00:00:01 |------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access(NVL("TELEFONE",0)=0) 2. Criando um indice composto (Composite Index) com valor arbitrario (Oracle 11g):Um indice composto e quando criamos um indice formado por mais de uma coluna. No nosso caso, vamos especificar a primeira coluna TELEFONE e a segunda coluna um valor arbitrario "0". Veja o comando de criacao por exemplo:CREATE INDEX idx_alunos_nometelefone ON tb_alunos(telefone);A coluna TELEFONE da tabela TB_ALUNOS foi concatenada (junta) a "0" no indice, possivel na versao 11g. Dessa forma garantimos que sempre havera valor indexado, pois os valores das colunas serao concatenadas. Onde for NULO na coluna TELEFONE, na outra coluna havera "0", portanto ha entrada no indice. Veja o exemplo da consulta:SELECT * FROM tb_alunos WHERE telefone IS NULL; Execution Plan----------------------------------------------------------Plan hash value: 1405752932-------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 57664 | 2027K| 27682 (1)| 00:05:33 || 1 | TABLE ACCESS BY INDEX ROWID| TB_ALUNOS | 57664 | 2027K| 27682 (1)| 00:05:33 ||* 2 | INDEX RANGE SCAN | IDX_ALUNOS_TELEFONENULL | 57664 | | 160 (0)| 00:00:02 |-------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("TELEFONE" IS NULL)Em alguns casos, mesmo com indices voltados para os valores NULOS, um FTS pode ser mais vantajoso, pois se