[firebase-br] Uso de Indices

Rodrigo firebase em dominioinf.com.br
Qua Nov 22 09:11:12 -03 2017


Bom dia Marcos, obrigado pela resposta.

Num outro post o Leo passou uma sugestão que deu muita diferença no 
resultado;

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


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


Eu achava que o left join so traria os dados da esquerda, ou seja, a tabela 
detailfiscal deveria ficar sempre em cima.
Mas aparentemente fazendo o inverso trouxe os mesmos resultados.

Vivendo e aprendendo.

Grato pela ajuda!



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

qual foi o plan desse caso?

"WHERE (D.QTD-D.VENDIDO) > 0 AND ORIGEM='B' and N.NUMNOTA = '91467'"

tenta alterar para primeiro o N.NUMNOTA (que deve possuir indice), deixa o
calculo (QTD - VENDIDO) por ultimo

-=Ma®©oS=-
Marcos R. Weimer
Delphi / C# / ASP.NET / PHP / WebServices / Firebird
http://eudoparana.blogspot.com.br/


Em 22 de novembro de 2017 08:39, Rodrigo <firebase em dominioinf.com.br>
escreveu:

> 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.CODIGOP
> RODUTO,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/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/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