Você está na página 1de 5

ndices no Oracle

By Fernando Boaglio. Filed in Oracle |

Saber usar ndices no Oracle o que diferencia os desenvolvedores Oracle dos outros. A pedido de um colega eu vou escrever um pouco sobre esse assunto. Para a minha breve demonstrao , utilizarei a ferramenta Oracle SQL*Plus que acompanha a instalao do banco de dados. Se desejar, pode usar outra opo gratuita da Oracle de manipulao de banco de dados, que nada mais que a engine do JDeveloper adequada somente ao desenvolvimento de SQL e PL/SQL: Oracle SQL Developer. O banco de dados Oracle tem diversos mecanismos para melhorar a performance de suas queries (consultas).

Primeiro vamos entender o seguinte: procure somente otimizar alguma query se realmente houver necessidade, ficar tentando otimizar antes mesmo de precisar algo intil e uma completa perda de tempo. No se esqueam do que Donald Knuth disse:Ns devemos esquecer de pequenas melhorias (praticamente em 97% do tempo): otimizao prematura a raiz de todo o mal. Outra coisa: eu no sou DBA e posso ter alguns conceitos que se j no o so, podem se tornar ultrapassados em pouco tempo. Alm disso, para saber se algo lento ou rpido, preciso de alguma mtrica. No d para saber se um carro mais veloz que o outro s pela nossa noo, preciso de um velocmetro. Em queries no diferente, para isso usamos um mecanismo que detalha o que o banco de dados vai fazer e joga numa tabela para voc consultar. Essa tabela se chama PLAN_TABLE, consulte esse artigo para entend-la melhor. Vou primeiro enumerar alguns conceitos importantes antes de detalhar os ndices: 1. 2. 3. ndice um objeto do banco de dados utilizado para acessar o dado existente numa tabela mais rapidamente ROWID o endereo fsico do registro , informando em qual arquivo e setor o dado exatamente est. hint so orientaes de uso de ndice ou algoritmo feitas para a engine do Oracle executar.

4.

analyze mtodo interno do banco usado para armazenar as informaes exatas sobre os seus dados dentro do dicionrio de dados. Essas informaes sero usadas pelo Oracle em todo novo SQL.

5.

FULL TABLE SCAN processo que o RDBMS no utiliza nenhum ndice para ler os dados de uma tabela. Basicamente toda vez que se executa um SQL no banco de dados, o Oracle tem como opo duas maneiras de trabalho: por regras e por estatsticas . Antigamente se usava somente via regra e quase todas queries tinham hints, pois o otimizador do Oracle no era muito bom. Hoje quem trabalha s na base de regra louco, isso existe no banco de dados assim como aquelas malditas colunas LONG RAW que s do dor de cabea ao desenvolvedor: compatibilidade! Para no ter dor de cabea s manter as estatsticas de sua base de dados atualizada, que o Oracle quase sempre acha a melhor maneira de montar uma query. Se voc tiver um jeito melhor, pode mesmo assim usar hint. O ndice do banco de dados no aquela coisa do outro mundo, ele segue a mesma filosofia de um ndice de um livro: achar a informao que procura mais rapidamente. Voc pega o Effective Java e quer achar aquela dica de checked exceptions, voc tem duas opes:

1. 2.

folhear uma por uma as quase 250 pginas at achar o que procura, ou olhar o ndice, descobrir o nmero da pgina (que 174) e abrir o livro na pgina exata Ok, parece uma loucura usar a primeira opo, mas isso somente funciona se voc sabe o tamanho do livro. Se fosse um simples guia de consulta rpida de apenas 2 pginas, a segunda opo seria a mais irracional, certo? Pois bem, no banco de dados exatamente desse jeito que a coisa funciona. Vamos ver um exemplo no nosso banco de dados: SQL> create table obj ( 2 id number primary key, 3 nome varchar2(30) ); Table created. SQL> insert into obj 2 select rownum, object_name 3 from all_objects; 63861 rows created. SQL> commit; Commit complete. SQL> create table obj_sem_analyze as select * from obj; Table created. SQL> alter table obj_sem_analyze add primary key (id);

Table altered. SQL> No caso da tabela OBJ, temos um ndice criado automaticamente para a chave primria, que nesse caso a coluna ID. Internamente, o Oracle armazena numa estrutura otimizada de rvore B, com a informao do valor da chave (ID) e do ROWID. Observem no exemplo abaixo obtemos o mesmo registro atravs da chave primria e do ROWID: SQL> select * from obj where ID=1234; ID NOME - 1234 V$_LOCK SQL> select * from obj where ROWID=AAAQCeAAEAAAAQMAAf; ID NOME - 1234 V$_LOCK Portanto, na realidade o ndice simplesmente uma combinao de identificadores e endereos fsicos, assim como listados abaixo: SQL> select id,rowid from obj where nome=V$_LOCK; ID ROWID - 1234 AAAQCeAAEAAAAQMAAf SQL> Se comparamos com um ndice de um livro, a coluna ID seria o ttulo e a coluna ROWID seria o nmero da pgina. Simples assim. Vamos voltar para o exemplo e ver algumas informaes do dicionrio de dados sobre essa tabela recm-criada dentro da view USER_TABLES. Antes disso, verifiquem que tipos de informaes a view contm, mas no precisa olhar no Google no, isso est no prprio banco: select * from dict_columns where table_name=USER_TABLES Esse comando listar o nome e descrio de cada uma das 50 colunas.

Agora somente na tabela obj vamos colher as estatsticas com o comando analyze: SQL> analyze table obj compute statistics; Table analyzed. SQL> Agora listaremos as informaes que o banco de dados contm: SQL> select table_name,num_rows,blocks,empty_blocks from user_tables; TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS - - OBJ 63861 370 14 OBJ_SEM_ANALYZE SQL> Note no resultado acima que da tabela OBJ o Oracle sabe algumas coisas, entre elas que contm 63861 registros, j a OBJ_SEM_ANALYZE o Oracle no sabe nada. O que acontece agora que com a tabela OBJ o Oracle sabe se, dependendo da query utilizada, ele vai usar o ndice da chave primria ou vai fazer um FULL TABLE SCAN. Observem o seguinte exemplo: exatamente a mesma query para as duas tabelas, porm a com as estatsticas roda com um custo muito menor (648 contra 2130) . Custo menor para query significa que ela executar em menos tempo. Exemplo de query sem estatsticas no Oracle SQL Developer:

Exemplo de query com estatsticas no Oracle SQL Developer:

Espero que esse breve artigo tenha esclarecido o funcionamento de ndices no Oracle. Portanto chame o seu DBA de canto e pergunte: quando foi que voc rodou o analyze da ltima vez? Voc poder se surpreender com a resposta! =) Fernando Boaglio, para a comunidade. =)