A importância do uso de Índices

O objetivo de artigo é explicar a importância de uso de índices em tabelas que usam comandos SQL com literais.

Porque o índice é importante?
Índices (Index) são importantes pois diminuem processamento e I/O em disco.
Quando usamos um comando SQL para retirar informações de uma tabela, na qual, a coluna da mesma não possui um índice, o Oracle faz um Acesso Total a Tabela para procurar o dado, ou seja, realiza-se um FULL TABLE SCAN degradando a performance do Banco de Dados Oracle.
Com o índice isso não ocorre, pois com o índice isso apontará para a linha exata da tabela daquela coluna retirando o dado muito mais rápido.
Mais informações sobre índices (indexes) acesse Documento Oracle (Index).


Vamos usar o explain plan para analisarmos o comando SQL para a realização de testes.
Mais informações sobre explain plan acesse Documento Oracle (Explain Plan).

SQL> show user
USER is "MASTER"
SQL>

Com o usuário MASTER vamos executar o comando SQL para realizarmos o teste.

SQL> set lines 155
SQL> set pages 1000
SQL> select prd_id, prd_name from master.product where prd_name = 'Product A321849';

    PRD_ID PRD_NAME
---------- --------------------------------------------------
    321850 Product A321849

SQL>

Vamos tirar um plano do comando acima e verificar o custo de CPU para executar o mesmo.

SQL> explain plan for select prd_id, prd_name from master.product where prd_name = 'Product A321849';

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 427209646

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |    30 |  1200 |   755   (1)| 00:00:10 |
|*  1 |  TABLE ACCESS FULL| PRODUCT |    30 |  1200 |   755   (1)| 00:00:10 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("PRD_NAME"='Product A321849')

Note
-----
   - dynamic sampling used for this statement (level=2)

17 rows selected.

SQL>

Conforme informações acima, o comando acima está realizando um FULL TABLE SCAN com “Cost (%CPU)” de 755 (1) na tabela PRODUCT.
Observando o filtro na informação dos predicados podemos observar que está sendo feito um filtro pela coluna PRD_NAME da tabela PRODUCT.
Vamos criar um índice nesta coluna desta tabela e executar novamente o explain plan para retirar o plano de acesso após o índice criado.

SQL> create index idx_prd_name_01 on product(prd_name);

Index created.

SQL> explain plan for select prd_id, prd_name from master.product where prd_name = 'Product A321849';

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
Plan hash value: 2904014416

-----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |     1 |    40 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PRODUCT         |     1 |    40 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_PRD_NAME_01 |     1 |       |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("PRD_NAME"='Product A321849')

Note
-----
   - dynamic sampling used for this statement (level=2)

18 rows selected.

SQL>

Conforme acima, após criado o índice “IDX_PRD_NAME_01” para a coluna “PRD_NAME” da tabela “PRODUCT” o custo de CPU diminuiu de 755 para 4, pois foi utilizado o índice para retirar a informação da tabela.
Portanto podemos concluir que o uso de índices é eficaz para o Tuning da Aplicação e do Banco de Dados.

%name A importância do uso de Índices

Autor: Maycon Tomiasi

Formado em Tecnologia da Informação na FIPP (Faculdade de Informática de Presidente Prudente), Analista DBA Oracle pela Teiko Soluções em Tecnologia da Informação, residente em Blumenau/ SC, Certificado OCP 10g/11g/12c, OCS 11g Implementation, OCE 11g Performance Tuning, OCE 11g RAC & GRID e OPN Specialist. Conhecimentos em PHP.