[firebase-br] Uso de Indices
Rodrigo
firebase em dominioinf.com.br
Qua Nov 22 08:45:27 -03 2017
Bom dia Léo, obrigado pela resposta,
vc tem toda razão, ficou muito mais rapido!
SELECT
D.BCPISST,BCCOFINSST,D.PALIQPIS,D.PALIQCOFINS,D.CSTPIS,D.CSTCOFINS,D.BCPIS,D.BCCOFINS,D.VALORPIS,D.VALORPISST,D.VALORCOFINS,D.VALORCOFINSST,D.PORCICMS,N.CRT,
D.PORCRED,D.IPI,D.PORCIPI,D.SITUACAO,D.ACUMULATIVO,D.CODIGOPRODUTO,D.UNIDADE,
(D.QTD-D.VENDIDO) AS
ESTOQUE,D.CODIGO,D.CODPRODUTO,D.PRODUTO,D.REFERENCIA,D.QTD,D.VALORUNIT +
(coalesce(D.VALORFRETE,0) / D.QTD) + (coalesce(D.VALORSEGURO,0) / D.QTD) +
(coalesce(D.VALOROUTROS,0) / D.QTD) + (coalesce(D.VALORSUBS,0) / D.QTD) -
(coalesce(D.DESCONTO,0) / D.QTD) AS UNITARIO ,
D.VALORTOT,N.NUMNOTA,N.EMISSAO, (D.BCICMSSUBS / D.QTD) AS BASESUBS,
(D.VALORSUBS / D.QTD) AS VALORST FROM DETAILFISCAL D
LEFT JOIN NOTAFISCAL N ON (N.SEQUENCIAL=D.CODSEQ)
WHERE (D.QTD-D.VENDIDO) > 0 AND DEONDEVEM='B' and N.NUMNOTA = '91467'
PLAN JOIN (D NATURAL, N INDEX (PK_NOTAFISCAL))
Prepare: 16 ms Execute: 514 ms Fetch: 483 ms
Utilizando sua sugestão:
SELECT
D.BCPISST,BCCOFINSST,D.PALIQPIS,D.PALIQCOFINS,D.CSTPIS,D.CSTCOFINS,D.BCPIS,D.BCCOFINS,D.VALORPIS,D.VALORPISST,D.VALORCOFINS,D.VALORCOFINSST,D.PORCICMS,N.CRT,
D.PORCRED,D.IPI,D.PORCIPI,D.SITUACAO,D.ACUMULATIVO,D.CODIGOPRODUTO,D.UNIDADE,
(D.QTD-D.VENDIDO) AS
ESTOQUE,D.CODIGO,D.CODPRODUTO,D.PRODUTO,D.REFERENCIA,D.QTD,D.VALORUNIT +
(coalesce(D.VALORFRETE,0) / D.QTD) + (coalesce(D.VALORSEGURO,0) / D.QTD) +
(coalesce(D.VALOROUTROS,0) / D.QTD) + (coalesce(D.VALORSUBS,0) / D.QTD) -
(coalesce(D.DESCONTO,0) / D.QTD) AS UNITARIO ,
D.VALORTOT,N.NUMNOTA,N.EMISSAO, (D.BCICMSSUBS / D.QTD) AS BASESUBS,
(D.VALORSUBS / D.QTD) AS VALORST FROM NOTAFISCAL N
LEFT JOIN DETAILFISCAL D ON (N.SEQUENCIAL=D.CODSEQ)
WHERE (D.QTD-D.VENDIDO) > 0 AND DEONDEVEM='B' and N.NUMNOTA = '91467'
PLAN JOIN (N INDEX (IDX_NOTAFISCAL_NUMNOTA), D INDEX
(IDX_DETAILFISCAL_CODSEQ))
Prepare: 0 ms Execute: 31 ms Fetch: 0 ms
E aparentemente, trouxe os mesmos registros!
Grato pela Ajuda.
-----Mensagem Original-----
From: Léo Mees
Sent: Wednesday, November 22, 2017 8:20 AM
To: FireBase
Subject: Re: [firebase-br] Uso de Indices
Eu alteraria o teste 2 para:
SELECT D.* FROM NOTAFISCAL N
LEFT JOIN DETAILFISCAL D ON (D.CODSEQ=N.SEQUENCIAL)
WHERE N.NUMNOTA=30000
Deve ficar muito rapido, o mesmo vale para o teste 3.
Levando em conta que existe indice de integridade entre as duas tabelas.
*Leonardo Mees.*
Itapiranga, SC
Em 22 de novembro de 2017 07:57, Marcos R. Weimer <marcosweimer em gmail.com>
escreveu:
> Ola!
>
> Por que está fazendo join no "NOTAFISCAL" ? Quais dados do cabeçalho você
> precisa nos itens ?
>
> Pergunto por que aqui usamos 2 querys, uma para o cabeçalho e outra para
> os
> itens, é rapido, temos clientes mais de 1.4 milhoes de notas emitidas,
> mais
> de 3 milhões de itens e não demora 6 segundos...
>
> por exemplo (neste banco com mais de 1.4 milhões de notas, servidor é um
> i7
> 2.8 8gb mas tem bastante coisa rodando nele, não é exclusivo para o banco
> pq é um servidor de testes):
>
> No cabeçalho
>
> Prepare time = 32ms
> Execute time = 15ms
> Avg fetch time = 15,00 ms
>
> nos itens: (neste caso especifico foram 6 itens)
>
> Prepare time = 31ms
> Execute time = 31ms
> Avg fetch time = 7,75 ms
>
>
> se juntar os 2 no mesmo (com left como vc fez)
>
> Prepare time = 46ms
> Execute time = 46ms
> Avg fetch time = 12,00 ms
>
> O que pode estar influenciando é o where, veja o seu "WHERE
> N.NUMNOTA=30000" neste caso deve usar o da tabela principal, já que o
> mesmo
> campo está disponivel nela, e não a do join, assim o indice é otimizado.
>
> Bom, ai estão meus 2 cents de contribuição, deixa o pessoal mais
> experiente
> falar sobre o assunto.
>
>
> -=Ma®©oS=-
> Marcos R. Weimer
> Delphi / C# / ASP.NET / PHP / WebServices / Firebird
> http://eudoparana.blogspot.com.br/
>
>
> Em 21 de novembro de 2017 18:17, Rodrigo <firebase em dominioinf.com.br>
> escreveu:
>
> > Boa tarde a todos,
> >
> > Estou com um clientes que tem emissao de nota fiscal e na tabela
> > notafiscal ja possui 40.000 notas
> > e na tabela detailfiscal mais de 100.000 registros, pelo que ouço falar
> > não é muito pois muitos falam
> > em milhoes de registros e funciona bem rapido.
> >
> > Porem tenho encontrado alguma lentidão no meu caso, fiz uns testes para
> > ver a questão dos indices:
> >
> > Teste 1 -- utilizou a index foi rapido
> >
> > SELECT D.* FROM DETAILFISCAL D
> > LEFT JOIN NOTAFISCAL N ON (D.CODSEQ=N.SEQUENCIAL)
> > WHERE D.CODIGO=3000
> >
> > PLAN JOIN (D INDEX (PK_DETAILFISCAL), N INDEX (PK_NOTAFISCAL))
> >
> > Prepare: 0 ms Execute: 188 ms Fetch: 0 ms
> >
> > Teste 2 -- Não foi tão rapido - Não usou index
> >
> > SELECT D.* FROM DETAILFISCAL D
> > LEFT JOIN NOTAFISCAL N ON (D.CODSEQ=N.SEQUENCIAL)
> > WHERE N.NUMNOTA=30000
> >
> >
> > PLAN JOIN (D NATURAL, N INDEX (PK_NOTAFISCAL))
> >
> > Prepare: 0 ms Execute: 686 ms Fetch: 514 ms
> >
> > Teste 3 -- Não foi tão rapido - Não usou index
> >
> > SELECT D.* FROM DETAILFISCAL D
> > LEFT JOIN NOTAFISCAL N ON (D.CODSEQ=N.SEQUENCIAL)
> > WHERE N.NUMNOTA STARTING WITH 3000
> >
> > PLAN JOIN (D NATURAL, N INDEX (PK_NOTAFISCAL))
> >
> > Prepare: 0 ms Execute: 702 ms Fetch: 530 ms
> >
> > Essas são selects simples, porem em algumas mais complexas, pode gerar 4
> a
> > 6 segundos de espera.
> >
> > Ja fiz backup e restore no banco mas continua lento.
> >
> > O que posso fazer para estar melhorando a performance?
> >
> > Grato
> >
> >
> > ---
> > Este email foi escaneado pelo Avast antivírus.
> > https://www.avast.com/antivirus
> >
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://www.firebase.com.br/pes
> > quisa_lista.html
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://www.firebase.com.br/
> pesquisa_lista.html
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas:
http://www.firebase.com.br/pesquisa_lista.html
Mais detalhes sobre a lista de discussão lista