Você está na página 1de 16

Query Performance

Everson Choma
30/04/2018
Agenda
• Criando consultas performáticas

• Ordem de execução de uma query

• Melhores práticas para criação de consultas e ganho de performance

• Plano de execução

• Como extrair um plano de execução a partir de consultas simples

• Como fazer a leitura

• Refatorando consultas utilizando informações retiradas de um planos de execução

• Indexes

• Identificando índices bons/ruins

• Criação de indexes eficazes

• Procedures/Functions/Triggers

• Visualizando planos de execução

• Hints, Identificando gargalos de execução e consumo excessivo de recursos, etc


1 – Criando consultas performáticas

• Ordem de execução:

• FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT
-> ORDER BY

• A escolha dos comandos SQL que são usados nas consultas


produzem um efeito significativo sobre o desempenho, para
bom ou para ruim.

• O uso de comandos SQL pode fazer com que o plano de


execução utilize OU não um index.
• Vantagens de utilizar recursos para criação de querys podem trazer:
• Habilitar indexes para eliminar a necessidade de TABLE SCAN.
• Reduzir o número de SORTs, MERGEs:
• Isto é, reduzir o número de registros que serão reordenados, fitrados, etc

• Dicas práticas para criação de consultas e ganho de performance


• Selecione apenas o número de colunas necessárias para retornar os dados.
Evite utilizar o símbolo *, e especifique cada coluna.
• Não utilizar funções ao unir tabelas com colunas de tipo diferentes.
• Exemplo: unir colunas do mesmo tipo é sempre melhor.
• Ao unir as colunas em um JOIN ou relativo, sempre use o nome completo, não
deixe o oracle deduzir essa informação, pois isso pode provocar perda de
index.
• Exemplo: TABELA.COLUNA.

• Considerações rápidas:
• EXISTS em vez de IN e NOT EXISTS em vez de NOT IN

• NOT EXISTS em vez de MINUS

• WHERE em vez de HAVING

• UNION ALL em vez de UNION

• LEFT JOIN e procurar por valores NULL em vez de NOT IN

• Não utilizar funções em colunas que possuam índices


• Exemplo: …WHERE NVL(COD_EMPRESA_FW, 1) = 1

• Evite construir querys complexas, pois prejudica a manutenção. Procure


sempre criar soluções simples que atendam a necessidade.
2 – Plano de execução

• O que é um Plano de execução?


• o plano de execução (execution plan) é um
conjunto ordenado de passos utilizados para
acessar dados em um banco relacional.
2 – Plano de execução

• Exemplo de um plano de execução (ORACLE)


2 – Plano de execução

• Compare diferentes tipo de execução para uma mesma query,


reescrevendo a query de formas diferentes.
• Usar colunas que contem uma relação entre elas qdo montar
JOINs
• Quem deve ser unido primeiro nos joins?
• Colunas da primary key devem as primeiras a serem unidas, seguidas pelas indexadas.

• Faça ligação entre colunas que possuam mesmo tipo de dados, evitando conversões
(CONVERT, CAST, etc)

• Eliminar o máximo de registros em uma consulta no momento do join


• se o WHERE for colocado em um JOIN, os filtros em sequência serão aplicados num menor
número de registros.
3 - Indexes

• Quais colunas devo indexar? Quais são as melhores formas de


decidir?
• Colunas que são frequentemente utilizadas em consultas podem ser candidatas a se
tornar um index.

• Faça manutenção de indexes: fargmentação de index causa perda de performance.

• Ao criar um index com mais de uma coluna, devemos seguir uma pequena regra para
decidir qual será a ordem das colunas no index:
• Colunas mais utilizadas em consultas.

• Seguido de colunas com dados mais seletos para os menos seletos..


3 - Indexes

• Como saber se o index que estou criando é ruim?


• Existem consultas que retornam informações sobre a utilização
do index pelo otimizador de consultas do banco.

• Criar indexes em uma tabela deliberadamente é possível


causar lentidão:
• em uma tabela com grande número de dados, o index será
muito grande em tamanho no banco, irá se fragmentar (na
medida de inserts/updates) e irá gerar manutenção,
necessitando de rebuilds, ou até, revisar a necessidade do index.
4 - Procedures/Functions/Triggers

• Vantagem do uso para performance:


• De modo geral, na primeira execução, teremos:
• Sintaxe é verificada -> plano de execução é selecionado ->
execução

• Próximas vezes:
• cached – execução

• Em versões mais atuais de bancos, os objetos já estão


compilados e armazenados em memória temporária (cached)
• Consultas simples também tem o plano de execução
armazenado na memória temp do banco
4 - Procedures/Functions/Triggers

• Boas práticas para construção de procedures


• Usar SELECT 1 ou invés de SELECT * em validações
• Usar cursores implícitos (ORACLE)
• Utilizar a visão do plano de execução para isolar pontos de
lentidão.
4 - Procedures/Functions/Triggers

• Funções
• Cuidar com utilizar funções em loops, WHEREs
• Em um loop, para cada execução, irá ser chamada a função e será
agregado o consumo de recurso para execução da função. Se
possível, incluir o trecho da função dentro da própria procedure
que chama a execução.

• Visualizar plano de execução.


4 - Procedures/Functions/Triggers

• Triggers
• São disparadas em cada execução, determinadas pela definição
da trigger: BEFORE UPDATE, BEFORE INSERT, AFTER...
• Em um caso de tabela que recebe inserts frequentes, uma trigger
BEFORE INSERT será disparada a todo momento. Em um banco de
dados de grande número de usuários, isso pode ser um problema,
mesmo que a trigger apenas faça um UPDATE de uma coluna de
uma tabela de status de mercadoria de “N” para “S”, por exemplo.

• Visualizar plano de execução.


Perguntas?

www.becomex.com.br
Joinville | São Paulo | Campinas | Porto Alegre | Rio de Janeiro | Brasília
Obrigado!
Everson.choma@becomex.com.br

www.becomex.com.br
Joinville | São Paulo | Campinas | Porto Alegre | Rio de Janeiro | Brasília

Você também pode gostar