Você está na página 1de 41

TUNING DE BANCO DE

DADOS ORACLE
Msc. Renata Cascaes
Especialização em Banco de Dados
Roteiro

Aula 03

Estatísticas de Banco de Dados

Plano de Execução

Índices
Quando criar?
Quando não criar?
Tipos de Índices
Referências
Estatísticas de Banco de Dados

Estatística são informações detalhadas sobre o banco de


dados e seus objetos. As estatísticas são usadas pelo otimizador de
consultas do Oracle para escolher o melhor plano de execução a ser
executado, se baseando em informações como (cardinalidade,
seletividade, custo) e custo de hardware (memória, cpu, I/O). Com
isso quanto mais atualizadas forem as estatísticas, melhor para a
performance das querys.
Estatísticas de Banco de Dados

Seletividade: Número de valores distintos em uma coluna;

A seletividade de um índice pode variar de 0 a 1, sendo 1 ou 100% a


seletividade ideal, normalmente índices “Primary Key” ou “Unique Key”
possuem seletividade 1. Para calcular a seletividade de um índice de uma
coluna utilizamos a seguinte formula:

seletividade
=
Número de valores diferentes da coluna / Numero de registros da tabela
Estatísticas de Banco de Dados

• Custo: O custo é uma estimativa da quantidade de recursos que o servidor


consumirá para resolver a operação, como a quantidade de acessos a disco, o
consumo de CPU ou rede.
Custo = ( Quantidade de leituras de um único bloco * Tempo de leitura de um único
bloco + Quantidade de leituras de múltiplos blocos * Tempo de leitura de múltiplos
blocos + Ciclos de CPU / Velocidade da CPU ) / Tempo de leitura de um único bloco

• Cardinalidade: Representa o número de registros em uma fonte de dados.


Uma fonte de dados pode ser uma tabela, uma visão, o resultado de uma
junção ou mesmo um operador GROUP BY.
Estatísticas de Banco de Dados

Alteração constantes de objetos em um banco de dados geram estatísticas


desatualizadas.

As estatísticas devem ser regularmente atualizados para descrever com


precisão os objetos de banco de dados.

Estatísticas desatualizadas podem acarretar em impactos negativos para


performance das querys no banco de dados.

A partir da versão 10g , o Oracle já realiza coleta manual das estatísticas.

Coletar manualmente as estatísticas de forma cautelosa, uma vez que tal


procedimento consome altos recursos do banco e pode comprometer a
performance do mesmo.
Estatísticas de Banco de Dados
Janelas de manutenção predefinidas
Estatísticas de Banco de Dados
Janelas de manutenção predefinidas

Desabilitar/Habilitar coleta automática de estatísticas


Estatísticas de Banco de Dados

select CLIENT_NAME, STATUS from dba_autotask_client

Data da última coleta de estatísticas:

select LAST_ANALYZED from dba_tables where table_name


=‘AERONAVE’
Estatísticas de Banco de Dados
Coleta manual de estatísticas

Package DBMS_STATS

Foi introduzido no Oracle 8i;

Método mais eficiente e indicado para coletar estatísticas para o CBO.

Permite coletar estatísticas exatas ou estimadas de objetos


individualmente (tabelas, índices, cluster etc), schemas, banco de dados
completo e de sistema.
Estatísticas de Banco de Dados

Para coletar estatísticas exatas de uma tabela:


EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>’OWNER’,
TABNAME=>’TABELA’);

Para coletar estatísticas de um schema:


EXEC DBMS_STATS.GATHER_SCHEMA_STATUS(‘OWNER‘,NULL);

Para coletar estatísticas exatas de todo o banco de dados:


EXEC DBMS_STATS.GATHER_DATABASE_STATS;

Para coletar estatísticas exatas de sistema:


EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

Verificando as estatísticas de uma tabela especifica


select * from dba_tables where table_name = ‘AERONAVE'
Plano de Execução
Plano de Execução

É a sequência de operações que o Banco de Dados realiza durante a


execução de uma instrução SQL.

É exibido em forma de uma árvore de linhas, que representam cada operação


realizada durante a execução da query.

Os principais fatores que definem o plano de execução:

Dimensão das tabelas acessadas;

Diversidade de dados das tabelas (seletividade);

Cardinalidade;

Existência ou não de índices.


Como é obtido o plano de Execução?

O Otimizador utiliza as estatísticas das bases de dados coletadas pelo


Oracle. As estatísticas registram os principais fatores que definem o plano de
execução. Deste modo, o otimizador, em vez de percorrer todos os dados
afetados por um SELECT, já sabe inicialmente o que vai encontrar.
Por este motivo é muito importante manter as estatísticas atualizadas para
que produzam bons resultados nas queries, devido a ter sido escolhido o
plano de execução mais adequado.
Plano de Execução

Exibe informações como:

Ordem das tabelas referenciadas pela instrução

Método de acesso para cada tabela mencionada na instrução

Método de junção para tabelas afetadas por operações de junção na instrução

Operações de dados como filtro, classificação ou agregação

Otimização, como o custo e a cardinalidade de cada operação

Particionamento, como o conjunto de partições acessadas

Execução paralela, como o método de distribuição de entradas de junção


Plano de Execução – Métodos de acesso

Full table scan: Caminho de acesso em que os dados são recuperados


percorrendo todas as linhas de uma tabela. É mais eficiente para recuperar
uma grande quantidade de dados da tabela.
Nem sempre representa um método de acesso ruim
Index scan: Caminho de acesso em que os dados são recuperados através
do uso de índices. É mais eficiente para recuperar um pequeno conjunto de
linhas da tabela.
Nested loop join: Método de acesso de ligação (join) entre 2 tabelas ou
origens de dados, utilizado quando pequenos conjuntos de dados estão sendo
ligados e se a condição de ligação é um caminho eficiente para acessar a
segunda tabela.
Hash join: Método de acesso de ligação (join) entre 2 tabelas ou origens de
dados, utilizado para ligar grandes conjuntos de dados
Dentre outros...
Plano de Execução

Onde encontrar o plano de Execução?

PLAN_TABLE (SQL Developer ou SQL * Plus)


V$SQL_PLAN
V$SQL_PLAN_MONITOR (11g)
DBA_HIST_SQL_PLAN (AWR)
STATS $ SQL_PLAN (Statspack)
Arquivos de rastreamento gerados por DBMS_MONITOR
Evento arquivo 10053 trace
Plano de Execução

Permite visualizar o plano de execução que o


otimizador poderá usar para executar uma
instrução SQL. Insere o plano de execução na
tabela chamada PLAN_TABLE sem executar a
instrução SQL.

• Exemplo de plano de execução

EXPLAIN PLAN FOR


SELECT * FROM hr.employees e
INNER JOIN hr.departments d ON e.department_id =
d.department_id;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Plano de Execução – SQL Developer
Plano de Execução

A forma correta de ler o mapa do plano é começar pela instrução mais à direita (maior
nível). Quando duas instruções estão ao mesmo nível, começa-se pela que tem um ID
menor. Neste caso, vemos que a primeira instrução a ser executada será a n.º 4.
Plano de Execução

 Id: identificador da linha da instrução do presente plano.

 Operation: O tipo de instrução a ser executada.

 Name: Tabela ou índice a que se refere a Operation.

 Rows: Número de linhas afectadas ou acedidas.

 Bytes: Total de bytes que serão movimentados para ler os dados da instrução.

 Cost: O custo de CPU para a instrução. Este campo não tem qualquer
unidade, pelo que o mesmo deverá ser utilizado como meio de comparação.
Plano de Execução - Dicas

Para tunar uma query, altere uma instrução SQL inúmeras vezes, analise o
plano de execução de cada versão que foi alterada e opte por implementar
aquela versão que consome menos recursos (colunas Bytes e Cost (%CPU))
ou que apresenta menor tempo de resposta (coluna Time).

Verifique se as operações que estão sendo executadas em cada passo do


plano de execução são adequadas para a quantidade de dados a ser
retornada.

Se não forem adequadas, quando por exemplo no caso das estatísticas das
tabelas acessadas não estarem atualizadas, é possível forçar uma operação
que possa ser mais performática através do uso de hints.
LABORATÓRIO –
ESTATÍSTICAS E PLANO DE EXECUÇÃO
Índices

Os índices são estruturas opcionalmente criadas associadas a tabelas.

Funcionam como índice de um livro, auxiliando a localizar o caminho das


informações mais rapidamente.

Se não houver nenhum índice na tabela que está sendo consultada, o
Oracle irá executar o comando chamado de "TABLE ACCESS FULL“.
Serão lidas linha a linha da tabela até encontrar o item solicitado,
resultando no acesso total à tabela e possivelmente num maior gasto de
tempo para retornar o resultado da consulta se comparado com o uso de
índices.
Índices – Quando criar?

Índices otimizam consultas, mas degradam a performance de instruções


DML (insert, update, delete e merge), portanto, deve-se cria-los
criteriosamente, seguindo algumas das dicas abaixo:
1.Para otimizar consultas frequentes;
2.Nas colunas da cláusula WHERE, ordenação, agrupamentos e ligações;
3.Em geral, quando a consulta retorna poucas linhas da(s) tabela(s);
4.Em FKs para otimizar joins
5.O Oracle cria automaticamente um índice em colunas primary Keys

Em média criar um índice quando uma consulta recuperar entre 4 à 8%


do total de linhas de uma tabela.
Índices – Quando não criar?

• Quando a tabela contiver poucos registros. Para tabelas pequenas


geralmente é mais rápido o acesso full table scan do que utilizar o acesso
via índices;

• Quando as colunas não forem utilizadas com frequência como uma


condição na consulta.

• Em tabelas que sofrem muita DML (delete, insert e updadte).


Índices – Quando não criar?

Podem ocorrer quebra da utilização do índice nas seguintes situações:

Quando uma coluna for modificada por funções ou operadores aritméticos;

Quando forem efetuadas conversões de dados nos valores de uma coluna;

Quando os valores de uma coluna forem comparados com valores nulos;

Quando os valores de uma coluna forem comparados com operadores de


negação (<> , not in, not like )
Índices – Pontos de atenção!

O índice ocupa espaço em disco que em algumas situações ocupa tanto


quanto a tabela a que se refere;

O uso de índices é uma decisão de compromisso


entre a degradação de algumas operações e a maior
velocidade noutras, devendo ser ponderada e bem
analisado sua adoção ou não.
Índices – Verificando se é a coluna é uma
boa candidata a receber o índice
Índices – Verificando se é a coluna é uma
boa candidata a receber o índice

 NUM_DISTINCT: Indica o número de valores distintos em uma coluna.


Caso o valor dessa coluna seja muito baixo em relação ao seu total de
registros, isso quer dizer que essa coluna possui uma seletividade
baixa, tornando-a uma fraca candidata para a criação de um índice.

 NUM_NULL: Indica o numero de valores nulos para determinada


coluna. Se uma coluna possui poucos valores NULL, ela é uma boa
candidata a criação de um índice.
Índices – Tipos de Índices

Índices B-tree
Os índices "b-tree" do Oracle têm uma estrutura em árvore.
Alta cardinalidade;
Índices default, também conhecidos como “normais”, são muito utilizados
em ambientes OLTP.
Índices – Tipos de Índices

Índices Bitmap
Foi introduzido no Oracle 7.3 e só pode ser criado na versão Enterprise
Edition;
Mais indicado para baixa cardinalidade e ambientes onde não há alta
concorrência de gravações;
Podem ser utilizados para comparações com NULL e são muito
utilizados em ambientes OLAP.
Tipos de Índices - Índices compostos

Um índice composto é um índice criado contendo várias colunas de uma


tabela (máximo 32 colunas). As colunas em um índice composto podem
aparecer em qualquer ordem e não precisam ser adjacentes na tabela.

Considere a criação de um índice composto em colunas que são


frequentemente usadas juntas na cláusula “WHERE” combinadas com o
operador “AND”. Principalmente se a seletividade das colunas combinadas
é melhor do que a seletividade de qualquer uma delas individualmente.
LABORATÓRIO –
ÍNDICES COMPOSTOS
Tipos de Índices - Índices baseados
em funções

Executar uma função em uma coluna indexada na cláusula where impede que o
otimizador utilize o índice.

A partir do oracle 8i foi introduzido índices baseados em funções para combater


esse problema.

Um índice baseado em função calcula o valor de uma função ou expressão


envolvendo uma ou mais colunas e o armazena no índice.

A função usada para criar o índice pode ser uma expressão aritmética ou uma
expressão que contenha uma função SQL, função PL / SQL definida pelo usuário,
função de pacote ou texto explicativo em C. Por exemplo, uma função pode
adicionar os valores em duas colunas.
Tipos de Índices - Índices baseados
em funções

Índices baseados em função nunca terão desempenho melhor do que se fosse


um índice comum b-tree por exemplo.

Logo, caso seja possível substituir esse tipo de índice é melhor


LABORATÓRIO –
ÍNDICES BASEADO EM FUNÇÕES
Quando devo reconstruir ou fazer REBUILD de
índices?

De acordo com a Oracle os índices são auto-gerenciados e auto-


balanceados por isso não há necessidade de rebuild frequente, mas mesmo
assim, muitos profissionais justificam o REBUILD nas seguintes situações:
 Quando o índice está fragmentado;
 Quando você precisar mover o índice para um novo tablespace
 Quando você tiver um cenário em que uma aplicação removeu uma grande
quantidade de dados da tabela e não há previsão de que novos dados
sejam inseridos nela.
Quando devo reconstruir ou fazer REBUILD de
índices?

 O REBUILD de índices deve ser evitado sempre que possível, pois ele
consome muita CPU e I/O, impactando de forma negativa no
desempenho dos sistemas em produção.
 O comando de rebuild mas comumente utilizado concede um lock
exclusivo na tabela , o que pode gerar um impacto negativo
Referências Bibliográficas

https://docs.oracle.com/cd/E25054_01/server.1111/e16638/stats.htm
https://www.oracle.com/technetwork/pt/articles/database-performance/
indices-fks-3756675-ptb.html
http://dbtimewizard.com.br/blog/execution-plan-como-interpretar-os-
valores-estatisticos-coletados-durante-a-execucao/
https://docs.oracle.com/cd/B10501_01/server.920/a96533/ex_plan.htm
https://docs.oracle.com/cd/B19306_01/server.102/b14220/
schema.htm#CNCPT811
https://certificacaobd.com.br/2013/09/23/oracle-performance-tuning-
parte-iv-tuning-de-indices/
TUNING DE BANCO DE
DADOS ORACLE
Msc. Renata Cascaes
Especialização em Banco de Dados

Você também pode gostar