otimizaÇÃo de banco de dados oracle – sql trace – pl/sql dênio dos santos rodrigo gomes...
TRANSCRIPT
OTIMIZAÇÃO DE BANCO DE DADOSORACLE – SQL TRACE – PL/SQL
Dênio dos Santos
Rodrigo Gomes Santana
Wagner Warley Ferraz Silva
Professor: Rogério Morais Rocha
Objetivo
Capturar as consultas através da ferramenta SQL TRACE. Identificar as consultas que mais consomem recursos do banco de dados.
Analisar o Plano de execução das consultas utilizando a ferramenta PL/SQL Dev.
Cenário
SQL TRACE O SQL TRACE FOI UTILIZADO PARA CAPTURAR AS CONSULTAS QUE MAIS CONSOMEM RECURSOS DO SERVIDOR DE BANCO DE DADOS
As consultas identificadas que são mais custosas para o servidor de banco de dados, não são passíveis de muita otimização.
Nestas consultas não existem filtros para ser aplicados os índices. Nestes casos se faz um estudo para alterar a regra de negocio.
Uma das alternativas seria remover o UNION ALL que a maioria delas apresenta e executar cada uma delas separadamente.
Uma outra alternativa seria criar uma Procedure para fazer a inserção dos dados gerados pelas consultas em tabelas temporárias e retornar o resultado.
Otimização
Diante deste cenário vamos apresentar algumas consultas que
são passiveis de Otimização.
CASO 1SELECT F.CD_FITA, F.NM_FILME, C.VR_CORFROM TB_FITA F, TB_COR C WHERE C.CD_COR = F.CD_COR AND C.VR_COR > 3 ANDF.CD_FITA NOT IN (SELECT CD_FITA FROM TB_ITEM_LOCACAO_TITULAR WHERE DT_DEVOLUCAO IS NULL) UNION ALL SELECT F.CD_FITA, F.NM_FILME, C.VR_CORFROM TB_FITA F, TB_COR CWHERE C.CD_COR = F.CD_COR AND C.VR_COR > 3 ANDF.CD_FITA NOT IN (SELECT CD_FITA FROM TB_ITEM_LOCACAO_DEPENDENTE WHERE DT_DEVOLUCAO IS NULL)
CASO 1Índices Criados
create index IX_TB_COR_001on TB_COR(CD_COR,VR_COR)
create index IX_TB_ITEM_LOCACAO_TIT_001ON TB_ITEM_LOCACAO_TITULAR(CD_FITA,DT_DEVOLUCAO)
create index IX_TB_ITEM_LOCACAO_DEP_001ON TB_ITEM_LOCACAO_DEPENDENTE(CD_FITA,DT_DEVOLUCAO)
CASO 1
Modificações na Query
SELECT F.CD_FITA,F.NM_FILME,C.VR_COR
FROM TB_FITA F, TB_COR C
WHERE C.CD_COR = F.CD_COR AND C.VR_COR > 3 AND
NOT EXISTS (SELECT 1 FROM TB_ITEM_LOCACAO_TITULAR IL WHERE F.CD_FITA = IL.CD_FITA AND IL.DT_DEVOLUCAO IS NULL)
UNION ALL
SELECT F.CD_FITA, F.NM_FILME, C.VR_COR
FROM TB_FITA F, TB_COR C
WHERE C.CD_COR = F.CD_COR AND C.VR_COR > 3
AND NOT EXISTS (SELECT CD_FITA FROM TB_ITEM_LOCACAO_DEPENDENTE ID WHERE ID.CD_FITA = F.CD_FITA AND ID.DT_DEVOLUCAO IS NULL)
CASO 1Resultados
CASO 2QUERY
SELECT SUM(NVL(T.VR_PAGO,0) + NVL(D.VR_PAGO,0)) VR_PAGOFROM(SELECT SUM(A.VR_PAGO) VR_PAGOFROM TB_ITEM_LOCACAO_TITULAR AWHERE TO_NUMBER(TO_CHAR(A.DT_DEVOLUCAO,'YYYY')) = 2009) T,(SELECT SUM(A.VR_PAGO) VR_PAGOFROM TB_ITEM_LOCACAO_DEPENDENTE AWHERE TO_NUMBER(TO_CHAR(A.DT_DEVOLUCAO,'YYYY')) = 2009) D
CASO 2INDICES CRIADOS
create index IX_TB_ITEM_LOCACAO_TIT_001on
TB_ITEM_LOCACAO_TITULAR(TO_NUMBER(TO_CHAR(DT_DEVOLUCAO,'YYYY')))
create index IX_TB_ITEM_LOCACAO_DEP_001on
TB_ITEM_LOCACAO_DEPENDENTE(TO_NUMBER(TO_CHAR(DT_DEVOLUCAO,'YYYY')))
CASO 2RESULTADO
Conclusões
• Otimização de Querys não somente se refere a criação e utilização de Indices.
•Temos de avaliar também a query em si. Existe conversões que invalidam indices.
•Muitas vezes também e passível de rever a regra de negocio.