[firebase-br] Uso de Indices

Rodrigo firebase em dominioinf.com.br
Qua Nov 22 08:39:24 -03 2017


Bom dia Marcos, obrigado pela Resposta!

Nesse caso, fiz uma sql so pra teste, mas utilizo alguns campos das duas 
tabelas, o proprio N.NUMNOTA não esta presente
na tabela detailfiscal e se eu quise pesquisar pelo numero da nota fiscal, 
preciso fazer o join.

O motivo de estar usando as duas tabelas em conjunto, é porque preciso 
buscar a informação da compra para realizar a venda,
utilizando o modelo PEPS (Primeiro que entra, primeiro que sai)

O sql fica mais ou menos assim:

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 ORIGEM='B' and N.NUMNOTA = '91467'

Na minha maquina, até que fica rapido, I7 com 6gb de memoria e ssd, mas no 
cliente, onde o servidor é um I5 com 4 gb de memoria e hdd, demora bem mais
e na rede mais ainda.

Grato



-----Mensagem Original----- 
From: Marcos R. Weimer
Sent: Wednesday, November 22, 2017 7:57 AM
To: FireBase
Subject: Re: [firebase-br] Uso de Indices

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 





Mais detalhes sobre a lista de discussão lista