[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