Neste artigo, veremos como um índice pode melhorar o desempenho da consulta.
Introdução
Índices no Oracle e em outros bancos de dados são objetos que armazenam referências a dados em outras tabelas. Eles são usados para melhorar o desempenho da consulta, na maioria das vezes a instrução SELECT.
Eles não são uma “bala de prata” – eles nem sempre resolvem problemas de desempenho com instruções SELECT. No entanto, eles certamente podem ajudar.
Vamos considerar isso em um exemplo particular.
Exemplo
Para este exemplo, usaremos uma única tabela chamada Cliente que contém colunas como ID, Nome, Sobrenome, valor máximo de crédito, valor da data de criação e outras colunas que não usaremos.
SELECT customer_id,first_name,last_name, max_credit, created_date FROM customer;
Aqui está uma amostra da tabela.
[ID da tabela=38 /]
Agora, vamos encontrar o seguinte:
- Quem dos clientes foi adicionado à tabela na mesma data dos primeiros clientes
- Clientes filtrados por last_name em ordem crescente
- Exibir o ID do cliente, nome, sobrenome, crédito máximo e data de criação
Para fazer isso, crie a seguinte consulta:
SELECT customer_id, first_name, last_name, max_credit, created_date FROM customer WHERE created_date = ( SELECT MIN(created_date) FROM customer ) ORDER BY last_name;
A saída fica assim:
[ID da tabela=39 /]
Ele mostra os dados que queremos.
Desempenho antes da aplicação do índice
Agora, vamos ver o plano de explicação para essa consulta. Eu obtive isso executando EXPLAIN PLAN FOR para a instrução SELECT e o seguinte comando:
SELECT * FROM TABLE(dbms_xplan.display);
Você também pode obter um resultado de saída semelhante usando o recurso Explain Plan dentro de seu IDE.
Podemos ver que ele realiza um Table Access Full em dois pontos, ou seja, na subconsulta e na consulta externa. Isso ocorre porque não há índices na tabela a serem usados.
Ele tem um custo de 2934. Quando eu o executei, a consulta buscou 785 linhas em 1,9 segundos. Pode parecer rápido, mas este é apenas um exemplo em que podemos melhorar. As consultas em sistemas reais podem levar muito mais tempo.
Uma maneira de melhorar o desempenho dessa consulta é adicionar um índice à coluna created_date. Essa coluna é usada na cláusula WHERE da consulta externa e na função MIN da consulta interna.
Adicionar índice
Podemos adicionar um índice a esta tabela para melhorar o desempenho da consulta. Este índice será armazenado na coluna created_date para que o código fique assim:
CREATE INDEX idx_cust_cdate ON customer (created_date);
Agora, o índice é criado apenas nesta coluna. Isso deve nos dar uma melhoria de desempenho em nossa consulta, mas teremos que verificá-la primeiro.
Criamos um índice b-tree, que provavelmente é tudo o que precisamos nesta coluna. Confirmaremos isso no plano de explicação em breve. Escrevi um guia sobre índices Oracle, incluindo como saber qual tipo de índice deve ser usado, além de muitas outras informações valiosas.
Desempenho após o índice Adicionado
Vamos executar novamente o plano de explicação nesta consulta.
Podemos ver que um índice foi usado na última etapa. Mostra que um Full Scan foi executado com o índice idx_cust_cdate, que é o que acabamos de criar.
Ele também mostra um custo total de 1472 e busca os 785 registros em 0,9 segundos.
O tempo de execução melhorou apenas um pouco (de 1,9 para 0,9 segundos), mas isso representa uma melhoria de 50% apenas adicionando o índice a esse pequeno conjunto de dados.
Como mencionado anteriormente, as consultas reais serão mais complicadas do que esta e levarão mais tempo para serem executadas. Mas este é um exemplo de como um índice pode melhorar o plano de consulta e o tempo de execução da consulta.