Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 11, 2021 10:45 am Assunto: Performance no select firebird? |
|
|
Tenho esse select
Código: | select
conta.id,
conta.nome,
SUM(movconta.valor * CASE WHEN movconta.tipo in (0, 3) THEN 1 ELSE -1 END) AS valor
from conta
left join movconta on conta.id = movconta.id_conta
where conta.inativo = 0
group by 1,2
order by conta.nome |
Se teu retirar o join ele fica raído pq não envolve soma nas tabelas, mais preciso dessa soma de contas aparecendo
Tem como melhorar a performance desse select?
Aonde mexer pra ver se melhora?
O componente de select estou usando firedac FDQuery _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jan 11, 2021 12:14 pm Assunto: |
|
|
Bom dia,
Só pra confirmar, a performance é parecida se você rodar essa consulta através do IBExpert ou outra ferramenta?
Existe uma FK na tabela movconta referenciando a tabela conta utilizando o campo id_conta?
Se a resposta for sim para as duas perguntas acima, experimente remover o Case de dentro do Sum só para ver se está afetando muito a performance.
Editado pela última vez por imex em Qui Set 16, 2021 9:12 am, num total de 1 vez |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 11, 2021 1:21 pm Assunto: |
|
|
imex escreveu: | Bom dia,
Só pra confirmar, a performance é parecida se você rodar essa consulta através do IBExpert ou outra ferramenta?
Existe uma FK na tabela movconta referenciando a tabela conta utilizando o campo id_conta?
Se a resposta for sim para as duas perguntas acima, experimente remover o Case de dentro do Sum só para ver se está afetando muito a performance.
|
Sim para as duas perguntas
Deu uma pequena diferença sim. Agora se eu retirar o JOIN tmb ai fica instantâneo _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jan 11, 2021 2:31 pm Assunto: |
|
|
Você pode fazer um teste com uma subquery para obter a soma, dessa forma seria possível retirar o Join, mas não sei se vai afetar a performance:
Código: | select
conta.id,
conta.nome,
(select SUM(movconta.valor * CASE WHEN movconta.tipo in (0, 3) THEN 1 ELSE -1 END)
from movconta
where conta.id = movconta.id_conta) AS valor
from conta
where conta.inativo = 0
order by conta.nome |
Outro teste seria utilizar o Or na condição do Case em vez do In, mas novamente, acho que não vai fazer diferença:
Código: | SUM(movconta.valor * CASE WHEN movconta.tipo = 0 or movconta.tipo = 3 THEN 1 ELSE -1 END) AS valor |
Espero que ajude |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Jan 11, 2021 3:18 pm Assunto: |
|
|
imex escreveu: | Você pode fazer um teste com uma subquery para obter a soma, dessa forma seria possível retirar o Join, mas não sei se vai afetar a performance:
Código: | select
conta.id,
conta.nome,
(select SUM(movconta.valor * CASE WHEN movconta.tipo in (0, 3) THEN 1 ELSE -1 END)
from movconta
where conta.id = movconta.id_conta) AS valor
from conta
where conta.inativo = 0
order by conta.nome |
Outro teste seria utilizar o Or na condição do Case em vez do In, mas novamente, acho que não vai fazer diferença:
Código: | SUM(movconta.valor * CASE WHEN movconta.tipo = 0 or movconta.tipo = 3 THEN 1 ELSE -1 END) AS valor |
Espero que ajude | Imex, com a subquery o result ficou muito melhor, ja com o OR no lugar do IN não mudou nada, subquery deu certo amigo.
Obrigado. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Ago 09, 2021 4:13 pm Assunto: |
|
|
Este select ainda esta me dando dor de cabeça
Código: | select
conta.id,
replace (conta.nome, ' ', ' ') AS nome,
(select
coalesce(SUM(CAST(movconta.valor AS NUMERIC(15,2)) * CASE WHEN movconta.tipo in (0, 3) THEN 1 ELSE -1 END), 0)
from movconta
where conta.id = movconta.id_conta
and movconta.tipo IN (0, 1)
and movconta.status <> 30
) AS valor
from conta
where conta.inativo = 0
ORDER BY conta.nome |
Esta parte aqui
Código: | and movconta.tipo IN (0, 1) |
Da um pouco de lentidão.
Mais a maior lentidão é a primeira vez que é acessado ai demora muito, depois ele fica melhor a performance.
Tem um jeito de melhorar este select? _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 10, 2021 1:57 pm Assunto: |
|
|
Não sei se esse problema tem relação com essa consulta já que fica mais lento na primeira vez.
Experimente fazer uns testes removendo o Order By o e Replace (os 2 juntos e também um de cada vez) para ver se vai fazer alguma diferença. |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Ago 10, 2021 4:43 pm Assunto: |
|
|
imex escreveu: | Não sei se esse problema tem relação com essa consulta já que fica mais lento na primeira vez.
Experimente fazer uns testes removendo o Order By o e Replace (os 2 juntos e também um de cada vez) para ver se vai fazer alguma diferença. |
Boa tarde,
Mesmo removendo o que você solicitou ainda na primeira vez ficou lento
Olhe... Isso no meu pc que o banco esta local, em rede fica muito mais lento.
Código: | ------ Performance info ------
Prepare time = 0ms
Execute time = 9s 610ms
Avg fetch time = 533,89 ms
Current memory = 35.162.312
Max memory = 35.290.360
Memory buffers = 2.048
Reads from disk to cache = 9.521
Writes from cache to disk = 0
Fetches from cache = 459.008 |
Segunda vez fazendo o select
Código: | ------ Performance info ------
Prepare time = 0ms
Execute time = 703ms
Avg fetch time = 39,06 ms
Current memory = 35.162.152
Max memory = 35.315.624
Memory buffers = 2.048
Reads from disk to cache = 9.360
Writes from cache to disk = 0
Fetches from cache = 458.990 |
Deixando com os campos que removi
Código: | ------ Performance info ------
Prepare time = 0ms
Execute time = 750ms
Avg fetch time = 41,67 ms
Current memory = 35.171.792
Max memory = 35.328.368
Memory buffers = 2.048
Reads from disk to cache = 10.238
Writes from cache to disk = 0
Fetches from cache = 459.047
|
Agora removendo do filtro Citação: | and movconta.tipo IN (0, 1) |
Código: | ------ Performance info ------
Prepare time = 16ms
Execute time = 328ms
Avg fetch time = 18,22 ms
Current memory = 35.166.296
Max memory = 35.328.368
Memory buffers = 2.048
Reads from disk to cache = 8.143
Writes from cache to disk = 0
Fetches from cache = 454.439
|
Agora removendo o subselect
Código: | ------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 35.147.176
Max memory = 35.328.368
Memory buffers = 2.048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 172
|
O primeiro aonde ficou mais lento de todos é quando inicio o PC e não foi feito nenhuma consulta ainda sendo a primeira consulta do dia.
Na performance do ibexpert essa tabela movconta passou 215.215 vezes
Essa tabela movconta tem 215.227 registros cadastrados,
ja a tabela conta foi 55 vezes. sendo que é esse a quantidade de registos nessa tabela Todos indexados.
Código: | PLAN (MOVCONTA INDEX (FK_MOVCONTA_REF_CONTA, IDX_MOV_TIPO, IDX_MOV_TIPO))
PLAN (CONTA ORDER IDXNOMECONTA) |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Ago 10, 2021 6:22 pm Assunto: |
|
|
Essa consulta sem a subconsulta fica lenta na primeira vez?
Outras consultas também ficam lentas na primeira vez? |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 11, 2021 8:35 am Assunto: |
|
|
imex escreveu: | Essa consulta sem a subconsulta fica lenta na primeira vez?
Outras consultas também ficam lentas na primeira vez? |
Bom dia. Respondendo a pergunta
Primeira: Não fica instantâneo
Segunda: Tabela cliente tmb fica um pouco lento, mais o que mais o pessoal reclama é dessa que trago o movimento das contas.
Hj abrindo pela primeira vez mesmo comentando esse filtro and movconta.tipo IN (0, 1) fica lento
Código: |
------ Performance info ------
Prepare time = 0ms
Execute time = 16s 234ms
Avg fetch time = 901,89 ms
Current memory = 35.171.880
Max memory = 36.185.576
Memory buffers = 2.048
Reads from disk to cache = 33.115
Writes from cache to disk = 0
Fetches from cache = 603.937 |
Já comentando todo subselect como disse fica instantâneo a consulta _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Ago 11, 2021 9:51 am Assunto: |
|
|
Bom dia,
Acho que o problema não está na consulta, talvez esteja no banco de dados ou no servidor, já que está ocorrendo somente na primeira vez e com outras consultas também.
Acho que seria interessante você criar um banco de dados novo para fazer uns testes. |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Ago 11, 2021 5:11 pm Assunto: |
|
|
adriano_servitec escreveu: | imex escreveu: | Bom dia,
Acho que o problema não está na consulta, talvez esteja no banco de dados ou no servidor, já que está ocorrendo somente na primeira vez e com outras consultas também.
Acho que seria interessante você criar um banco de dados novo para fazer uns testes. |
Vou fazer uns testes pra ver se é isso.
Obrigado | A principio parece ter resolvido Imex.
O banco antigo estava com muito lixo
Criei um banco novo extrai o metadados e fiz o backup e restore no novo e além de ficar de 658,688KB para 83,952KB ficou bem mais rápido a primeira consulta. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
joemil Moderador
Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9098 Localização: Sinop-MT
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
|