SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
pen4education
Aumente drasticamente a performance do seu banco usando
consultas hierárquicas e recursivas
Trilha - Banco de Dados
Rodrigo Moutinho
@rcmoutinho
Dani Monteiro
@DaniMonteiroDBA
pen4education
• Hackeando sua consulta
• Conhecer recursos disponíveis
• Queries hierárquicas
• Queries recursivas
Agenda
pen4education
• Tabelas e relacionamentos
• Índices disponíveis
• Volume de dados de cada tabela consultada
Hackeando sua consulta
pen4education
Hackeando sua consulta
pen4education
• ERP TOTVS
• Fábrica de Camisa Esportiva
• O que tenho para liberar no meu estoque?
• Processo diário de mais de duas horas (um clique)
Exemplo Real
pen4education
• Subqueries
• Views
• Materialized Views
• Functions
Recursos disponíveis
pen4education
• Solicitar
• Consultar
• Criar
Níveis de Permissão
pen4education
SELECT
SC5.C5_NUM AS PED,
SC5.C5_VEND1 AS REPRES,
SA1.A1_NOME AS NOME,
(SELECT SUM((C6_QTDVEN - C6_QTDENT))
FROM SC6010 C6, SC9010 C9 WHERE ... [10 condições] ) AS QTDFAL,
(SELECT SUM((C6_QTDVEN - C6_QTDENT) * C6_PRCVEN)
FROM SC6010 C6, SC9010 C9 WHERE ... [10 condições] ) AS VALFAL,
(SELECT SUM (((C6_QTDVEN - C6_QTDENT) * C6_PRCVEN) - (C6_XQTD05 * C6_PRCVEN))
FROM SC6010 C6, SC9010 C9 WHERE ... [10 condições] ) AS VALOR,
SE4.E4_COND AS COND,
SC5.C5_OBSPED AS OBS,
SC5.C5_PREVIST as PREV,
SC5.C5_XST05 AS ST,
SC5.C5_XFRET AS FRET,
(SELECT SUM(C6_VALOR)
FROM SC6010 C6, SC9010 C9 WHERE ... [9 condições] ) AS TOT
FROM SC5010 SC5, SC6010 SC6, SC9010 SC9, SA1010 SA1, SF4010 SF4, SE4010 SE4
WHERE ... [29 condições]
GROUP BY SC5.C5_NUM, SC5.C5_VEND1, SA1.A1_NOME, SE4.E4_COND,
SC5.C5_OBSPED, SC5.C5_PREVIST, SC5.C5_XST05, SC5.C5_XFRET
ORDER BY SA1.A1_NOME
Subqueries
pen4education
Subqueries
Quantidade
Faltante
SC6 - Item
Pedido Venda
SC9 - Item
Pedido Venda
Liberado
SUM SELECT
pen4education
Subqueries
QTDFAL
SC6
SC9
SUM
VALFAL
SC6
SC9
VALOR
SC6
SC9
TOTAL
SC6
SC9
SUM
SUM
SUM
SELECT
SELECT
SELECT
SELECT
SELECT
pen4education
Common Table Expression
WITH APELIDO_1 AS (
SELECT ... FROM TABELA_1 ...
), APELIDO_2 AS (
SELECT ... FROM APELIDO_1 INNER JOIN TABELA_2 ...
)
SELECT ... FROM APELIDO_1 INNER JOIN APELIDO_2 ...
WHERE ...
GROUP BY ...
ORDER BY ...
pen4education
Queries Hierárquicas
• Reutilizar consultas de forma temporária
WITH TABLE_PEDIDO AS (
SELECT ...
), TABLE_QUANTIDADE AS (
SELECT ...
), TABLE_ITENS_C6 AS (
SELECT ... FROM TABLE_QUANTIDADE ...
)
SELECT ...
FROM TABLE_PEDIDO AS T_PEDIDO, TABLE_ITENS_C6 AS T_ITENS_C6, ...
WHERE ...
ORDER BY ...
pen4education
Melhor Performance
), TABLE_QUANTIDADE AS (
SELECT
C6_NUM AS C6NUM, C6_QTDVEN AS C6QTDVEN, C6_QTDENT AS C6QTDENT,
C6_PRCVEN AS C6PRCVEN, C6_XQTD05 AS C6XQTD05, C6_VALOR AS C6VALOR,
C6_XFLAG AS C6XFLAG, C6_LOCAL AS C6LOCAL, C6_TES AS C6TES
FROM SC6010 C6, SC9010 C9
WHERE ... [11 condições]
), TABLE_ITENS_C6 AS (
SELECT
C6NUM AS NUM,
C6TES AS C6TES,
SUM( (C6QTDVEN-C6QTDENT) ) AS QTDFAL,
SUM( (C6QTDVEN-C6QTDENT) * C6PRCVEN ) AS VALFAL,
SUM( ( (C6QTDVEN-C6QTDENT) * C6PRCVEN) - (C6XQTD05 * C6PRCVEN) ) AS VALOR,
SUM(C6VALOR) AS TOT
FROM TABLE_QUANTIDADE
GROUP BY C6NUM, C6TES
)
pen4education
Melhor Performance
Resultado
Pedidos de
Venda
Somatório
Quantidades
Quantidades
Item Pedidos de
Venda
pen4education
Legibilidade
WITH TABLE_PEDIDO AS (
SELECT ... FROM SC5010 SC5 WHERE ...
), TABLE_QUANTIDADE AS (
SELECT ... FROM SC6010 C6, SC9010 C9 WHERE ...
), TABLE_ITENS_C6 AS (
SELECT ... FROM TABLE_QUANTIDADE ...
)
SELECT DISTINCT T_PEDIDO.PED AS PED, T_PEDIDO.REPRES AS REPRES,
SA1.A1_NOME AS NOME, T_ITENS_C6.QTDFAL AS QTDFAL, ...
FROM TABLE_PEDIDO AS T_PEDIDO, TABLE_ITENS_C6 AS T_ITENS_C6, ...
WHERE T_ITENS_C6.NUM = T_PEDIDO.PED
AND SA1.A1_FILIAL = ' '
...
pen4education
Legibilidade
WITH TABLE_PEDIDO AS (
SELECT
SC5.C5_NUM AS PED,
SC5.C5_VEND1 AS REPRES,
SC5.C5_OBSPED AS OBS,
...
FROM SC5010 SC5
WHERE ... [6 condições]
), TABLE_QUANTIDADE AS (
pen4education
Legibilidade
), TABLE_QUANTIDADE AS (
SELECT
C6_NUM AS C6NUM,
C6_QTDVEN AS C6QTDVEN,
C6_QTDENT AS C6QTDENT,
...
FROM SC6010 C6, SC9010 C9
WHERE ... [11 condições]
), TABLE_ITENS_C6 AS (
pen4education
Legibilidade
), TABLE_ITENS_C6 AS (
SELECT
C6NUM AS NUM,
C6TES AS C6TES,
SUM( (C6QTDVEN-C6QTDENT) ) AS QTDFAL,
SUM( (C6QTDVEN-C6QTDENT) * C6PRCVEN ) AS VALFAL,
SUM( ( (C6QTDVEN-C6QTDENT) * C6PRCVEN) - (C6XQTD05 * C6PRCVEN) ) AS VALOR,
SUM(C6VALOR) AS TOT
FROM TABLE_QUANTIDADE
GROUP BY C6NUM, C6TES
)
pen4education
Legibilidade
SELECT DISTINCT
T_PEDIDO.PED AS PED,
T_PEDIDO.REPRES AS REPRES,
SA1.A1_NOME AS NOME,
T_ITENS_C6.QTDFAL AS QTDFAL,
...
FROM
TABLE_PEDIDO AS T_PEDIDO,
TABLE_ITENS_C6 AS T_ITENS_C6,
SA1010 AS SA1,
SF4010 AS SF4,
SE4010 AS SE4
WHERE ... [11 condições]
ORDER BY SA1.A1_NOME
pen4education
• Reutilizar resultado da consulta
• Estruturas Hierárquicas
Queries Recursivas
pen4education
• Mostra o resultado por níveis,
• Quem são os registros “raízes”:
• Depois os “descendentes”
• Em seguida, “descendentes do descendente”...
Queries Recursivas
pen4education
Exemplo… Um menu
Fonte das imagens: https://blogs.msdn.microsoft.com/fcatae/2010/11/10/query-recursiva/
pen4education
E o código?
WITH RECURSIVE cteMenuNivel(id,Nome,Nivel,NomeCompleto)
AS (-- Ancora
SELECT id,Nome,1 AS 'Nivel',CAST(Nome AS VARCHAR(255)) AS 'NomeCompleto'
FROM tbMenu WHERE idPai IS NULL
UNION ALL
-- Parte RECURSIVA
SELECT
m.id,m.Nome,c.Nivel + 1 AS 'Nivel',
CAST((c.NomeCompleto + '/' + m.Nome) AS VARCHAR(255)) 'NomeCompleto'
FROM tbMenu m INNER JOIN cteMenuNivel c ON m.idPai = c.id)
SELECT Nivel,NomeCompleto FROM cteMenuNivel;
pen4education
Por que usar CTE?
• Mais fácil;
• Dependendo da quantidade de níveis o
desempenho é melhor;
pen4education
Rodrigo Moutinho
@rcmoutinho
Dani Monteiro
@DaniMonteiroDBA
http://db4beginners.com/e-book/

Mais conteúdo relacionado

Semelhante a Aumente drasticamente a performance do seu banco usando consultas hierárquicas e recursivas (6)

Tutorial comandosde geogebra
Tutorial comandosde geogebraTutorial comandosde geogebra
Tutorial comandosde geogebra
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
Estudo webas rastreabilidade_celulose_vr
Estudo webas rastreabilidade_celulose_vrEstudo webas rastreabilidade_celulose_vr
Estudo webas rastreabilidade_celulose_vr
 
Projeto de otimização de Performance e Redução de Custos Sistema On-Line
Projeto de otimização de Performance e Redução de Custos Sistema On-LineProjeto de otimização de Performance e Redução de Custos Sistema On-Line
Projeto de otimização de Performance e Redução de Custos Sistema On-Line
 
Tdc2015
Tdc2015Tdc2015
Tdc2015
 
Otimizando suas querys no postgreSQL
Otimizando suas querys no postgreSQLOtimizando suas querys no postgreSQL
Otimizando suas querys no postgreSQL
 

Mais de rcmoutinho

Mais de rcmoutinho (7)

Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
 
2 Ferramentas para Entregar Código 2x Mais Rápido (Ainda HOJE!)
2 Ferramentas para Entregar Código 2x Mais Rápido (Ainda HOJE!)2 Ferramentas para Entregar Código 2x Mais Rápido (Ainda HOJE!)
2 Ferramentas para Entregar Código 2x Mais Rápido (Ainda HOJE!)
 
Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
Performance e Produtividade: 2 Habilidades para Transformar seu Relacionament...
 
3 Passos Para a Carreira dos Seus Sonhos
3 Passos Para a Carreira dos Seus Sonhos3 Passos Para a Carreira dos Seus Sonhos
3 Passos Para a Carreira dos Seus Sonhos
 
Dramatically increase your database's performance using hierarchical and recu...
Dramatically increase your database's performance using hierarchical and recu...Dramatically increase your database's performance using hierarchical and recu...
Dramatically increase your database's performance using hierarchical and recu...
 
Sou preguiçoso! Eu automatizo meu dia-a-dia, sem ser um guru de infra
Sou preguiçoso! Eu automatizo meu dia-a-dia, sem ser um guru de infraSou preguiçoso! Eu automatizo meu dia-a-dia, sem ser um guru de infra
Sou preguiçoso! Eu automatizo meu dia-a-dia, sem ser um guru de infra
 
Elimine o estresse das tarefas repetitivas do seu projeto
Elimine o estresse das tarefas repetitivas do seu projetoElimine o estresse das tarefas repetitivas do seu projeto
Elimine o estresse das tarefas repetitivas do seu projeto
 

Último

Último (9)

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Aumente drasticamente a performance do seu banco usando consultas hierárquicas e recursivas