[firebase-br] RES: RES: RES: Ajuda com select

Carlos H. Cantu listas em warmboot.com.br
Quarta Março 17 16:33:53 -03 2021


Vc recalculou as estatisticas dos indices depois de importar os
dados?

Outra coisa:

SELECT COUNT(I.ID)
FROM itensfat i
LEFT JOIN pedidosfat p ON (P.CODIGO = I.CODIGO and I.ID_EMPRESA='114028')
LEFT JOIN CLIENTES AS TB ON (TB.CODCLIENTE = P.NUMCLIENTE and TB.ID_EMPRESA='114028' )
WHERE P.ID_EMPRESA='114028' AND TB.CODVENDEDOR = 2 AND I.ID_ATUALIZA>0

Você tem condições no WHERE em cima de campos da tabela
P e TB, portanto, não faz sentido usar LEFT JOIN nesses casos.

Experimente:

SELECT COUNT(I.ID)
FROM itensfat i
JOIN pedidosfat p ON (P.CODIGO = I.CODIGO and I.ID_EMPRESA=P.ID_EMPRESA)
JOIN CLIENTES AS TB ON (TB.CODCLIENTE = P.NUMCLIENTE and TB.ID_EMPRESA=P.ID_EMPRESA)
WHERE P.ID_EMPRESA = '114028' AND TB.CODVENDEDOR = 2 AND I.ID_ATUALIZA>0

e responda mostrando o tempo que demorou e qual foi o PLAN gerado. Não
esqueça de recalcular as estatisticas dos indices antes de testar.

PS: O count do Firebird é mais lento "por natureza", pois o FB usa a
arquitetura de Versioning, o que obriga o "count" a visitar todos os
registros encontrados pra saber se eles estão ou não visíveis para a
transação associada ao select.


[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

rvl> Boa tarde,

rvl> Puxei essa tabela do mysql, que esta online, e converti ela em
rvl> firebird para ficar em meu servidor.

rvl> O dados foram recém importados.

rvl> Tem índice em todos os campos.

rvl> "P.CODIGO = I.CODIGO and I.ID_EMPRESA='114028'  não consegui
rvl> identificar o erro aqui, a chave estrangeira é o P.CODIGO.

rvl> Pior que no servidor online com mysql esta rodando esse mesmo
rvl> sql sem índice nenhum criado com 1 segundo.

rvl> Grato



rvl> Enviado do Email para Windows 10

rvl> De: SERGIO LOPES via lista
rvl> Enviado:quarta-feira, 17 de março de 2021 15:34
rvl> Para: Odir Rodrigues de Oliveira via lista
rvl> Cc:SERGIO LOPES
rvl> Assunto: Re: [firebase-br] RES: RES: Ajuda com select

rvl>  Boa tarde,não sei se entendi muito bem mas...
rvl> o problema nao esta aqui "P.CODIGO = I.CODIGO and
rvl> I.ID_EMPRESA='114028'  "?  veja q nessa estrutura deveria ter uma
rvl> chave estrangeira para pedidofat de forma q iria consultar apenas
rvl> itens desse de cada pedido especificamente e da forma q está cada
rvl> pedido esta comparando com todos os registros da tabela itensfat...
rvl> penso q deveria sera p.codigo = i."chave_estrangeira_pedidofat" and ..
rvl> I.ID_EMPRESA='114028' esta parte aqui poderia ser considerado
rvl> redundante ?? pq a empresa nao ja identifica no pedidofat?

rvl> é isso ou estou enganado... a questão dos indices devem ser levando em consideração claro.
rvl> espero ter ajudado.

rvl>     Em quarta-feira, 17 de março de 2021 14:29:01 BRT, Odir
rvl> Rodrigues de Oliveira via lista <lista em firebase.com.br> escreveu:
rvl>  
rvl>  Nas suas tabelas existem Índices para os campos CODVENDEDOR e ID_ATUALIZA?
rvl> Caso negativo experimente criar.

rvl> Odir Rodrigues de Oliveira
rvl> Clipp-net Informática
rvl> São Carlos - SP
rvl> Fone: +55 16 3307-7369
rvl> Cel: +55 16 98137-2103
rvl> Site: www.clippnet.com.br


rvl> -----Mensagem original-----
rvl> De: lista [mailto:lista-bounces em firebase.com.br] Em nome de Gustavo Novaes
rvl> via lista
rvl> Enviada em: quarta-feira, 17 de março de 2021 08:35
rvl> Para: FireBase
rvl> Cc: Gustavo Novaes
rvl> Assunto: Re: [firebase-br] RES: Ajuda com select

rvl> Manda a estrutura das tabelas pra gente conhecer melhor. Talvez o uso de
rvl> CTE ajude. Ontem assisti uns vídeos no youtube de um cara chamado Edson
rvl> Gregório. Num deles falava sobre performance.

rvl> *Gustavo Novaes *




rvl> Em qua., 17 de mar. de 2021 às 08:27, rodrigo via lista <
rvl> lista em firebase.com.br> escreveu:

>> Bom dia Gustavo. Obrigado pela resposta,
>>
>> Mesmo resultado.
>>
>>
>>
>> Enviado do Email para Windows 10
>>
>> De: Gustavo Novaes via lista
>> Enviado:quarta-feira, 17 de março de 2021 08:04
>> Para: FireBase
>> Cc:Gustavo Novaes
>> Assunto: Re: [firebase-br] Ajuda com select
>>
>> Bom dia,
>> Minha sugestão, embora não tenha testado.
>>
>> SELECT COUNT(I.ID <http://i.id/>) FROM ITENSFAT ITENS
>> INNER JOIN PEDIDOSFAT PEDIDOS ON (PEDIDOS..CODIGO = ITENS.CODIGO and
>> ITENS.ID_EMPRESA='114028')
>> INNER JOIN CLIENTES AS CLIENTES ON (CLIENTES.CODCLIENTE =
>> PEDIDOS.NUMCLIENTE AND CLIENTES.CODVENDEDOR = 2)  and
>> TB.ID_EMPRESA='114028'
>> )
>> WHERE PEDIDOS.ID_EMPRESA='114028' AND AND ITENS.ID_ATUALIZA>0
>>
>> Gosto do uso de CTEs mas não domino ainda.
>>
>> *Gustavo Novaes *
>>
>>
>>
>>
>> Em qua., 17 de mar. de 2021 às 07:04, João Denóis via lista <
>> lista em firebase.com.br> escreveu:
>>
>> > Bom dia,
>> > A tabela Itensfat tem mais de 1.500.000 registros, e você passa ela em
rvl> um
>> > left, já pensou em passar com INNER? Existe a possibilidade de criar um
>> > index neste código tbm.
>> >
>> > Em ter., 16 de mar. de 2021 às 20:36, rodrigo via lista <
>> > lista em firebase.com.br> escreveu:
>> >
>> > > Boa noite!
>> > >
>> > > Tenho um select cujas tabelas
>> > > Itensfat tem mais de 1.500.000 registros
>> > > Pedidosfat mais de 400.000 registros
>> > > E clientes mais de 80.000 registros
>> > >
>> > > Tenho esse select
>> > >
>> > > SELECT COUNT(I.ID) FROM itensfat i
>> > > LEFT JOIN pedidosfat p ON (P.CODIGO = I.CODIGO and
>> I.ID_EMPRESA='114028')
>> > > LEFT JOIN CLIENTES AS TB ON (TB.CODCLIENTE = P.NUMCLIENTE and
>> > > TB.ID_EMPRESA='114028' )
>> > > WHERE P.ID_EMPRESA='114028' AND TB.CODVENDEDOR = 2 AND I.ID_ATUALIZA>0
>> > >
>> > > Com esse retorno:
>> > >
>> > > PLAN JOIN (JOIN (I INDEX (ITENSFAT_ID_ATUALIZA), P INDEX
>> > > (PEDIDOSFAT_CODIGO, PEDIDOSFAT_ID_EMPRESA)), TB INDEX
>> > > (IDX_CLIENTES_CODCLIENTE, IDX_CLIENTES_IDEMPRESA))
>> > >
>> > > Prepare: 47 ms  Execute: 50 s 157 ms  Fetch: 50 s 157 ms
>> > >
>> > > Se altero para
>> > > SELECT COUNT(I.ID) FROM pedidosfat p
>> > > LEFT JOIN itensfat i ON (P.CODIGO = I.CODIGO and
rvl> I.ID_EMPRESA='114028')
>> > > LEFT JOIN CLIENTES AS TB ON (TB.CODCLIENTE = P.NUMCLIENTE and
>> > > TB.ID_EMPRESA='114028' )
>> > > WHERE P.ID_EMPRESA='114028' AND TB.CODVENDEDOR = 2 AND I.ID_ATUALIZA>0
>> > >
>> > > Demora mais de 7 minutos
>> > >
>> > > Alguem tem alguma dica de como posso melhorar a performance desse
>> select?
>> > >
>> > > Grato




Mais detalhes sobre a lista de discussão lista