| 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, com a subquery o result ficou muito melhor, ja com o OR no lugar do IN não mudou nada, subquery deu certo amigo. 	  | 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
 | 
 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: |   |  
				| 
 |  
				| A principio parece ter resolvido Imex. 	  | 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
 | 
 
 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: 9100
 Localização: Sinop-MT
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		|  |