ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Melhorar performance select
Ir à página Anterior  1, 2
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Jul 07, 2021 3:09 pm    Assunto: Responder com Citação

Eu ainda não consegui entender sua ideia.

O que exatamente eu gravaria nesse campo novo? O valor que eu busquei?

Por exemplo se eu digitar %RUA%CURITIBA%

Gravar nesse campo todo o endereço que retorna rua curitiba?

Fazendo um loop e inserindo nele? as informações que vem daqui
Código:
endereco.endereco_logradouro,
            endereco.endereco_complemento,
            bairro.bairro_descricao bairrodescricao,
            cidade.cidade_descricao as cidadedescricao,
            uf.uf_sigla as ufsigla,
            endereco.endereco_cep as cep


Sinceramente ainda não entendi.
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Jul 07, 2021 3:34 pm    Assunto: Responder com Citação

É isso. Depois que você criar o campo você pode executar um Update para gravar o endereço completo nele.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Jul 07, 2021 4:12 pm    Assunto: Responder com Citação

imex escreveu:
É isso. Depois que você criar o campo você pode executar um Update para gravar o endereço completo nele.


Não tem como fazer dessa forma né.

Código:
update endereco
       set endereco.endereco_completo =
       (
       SELECT
           endereco.endereco_logradouro || ' ' ||
           endereco.endereco_complemento || ' ' ||
           bairro.bairro_descricao || ' ' ||
           cidade.cidade_descricao || ' ' ||
           uf.uf_sigla || ' ' ||
           endereco.endereco_cep as endereco_completo
      FROM uf
INNER JOIN cidade on cidade.uf_codigo = uf.uf_codigo
INNER JOIN bairro on bairro.cidade_codigo = cidade.cidade_codigo
INNER JOIN endereco on endereco.bairro_codigo = bairro.bairro_codigo
  WHERE  (
          UPPER(endereco.endereco_logradouro
              || cidade.cidade_descricao
              || bairro.bairro_descricao
              || uf.uf_sigla
              || uf.uf_descricao) LIKE :PBUSCA_CEP
          )
       )


Pq deu erro
multiple rows in singleton 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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Jul 07, 2021 4:38 pm    Assunto: Responder com Citação

Não testei mas experimente dessa forma para ver se funciona:

Código:
update endereco
set endereco_completo =
    upper
    (
        SELECT
            endereco.endereco_logradouro || ' ' ||
            endereco.endereco_complemento || ' ' ||
            bairro.bairro_descricao || ' ' ||
            cidade.cidade_descricao || ' ' ||
            uf.uf_sigla || ' ' ||
            endereco.endereco_cep
        FROM uf
        INNER JOIN cidade on cidade.cidade_codigo = endereco.cidade_codigo
        INNER JOIN bairro on bairro.bairro_codigo = endereco.bairro_codigo
        WHERE uf.uf_codigo = endereco.uf_codigo
    )


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Jul 08, 2021 9:38 am    Assunto: Responder com Citação

imex escreveu:
Não testei mas experimente dessa forma para ver se funciona:

Código:
update endereco
set endereco_completo =
    upper
    (
        SELECT
            endereco.endereco_logradouro || ' ' ||
            endereco.endereco_complemento || ' ' ||
            bairro.bairro_descricao || ' ' ||
            cidade.cidade_descricao || ' ' ||
            uf.uf_sigla || ' ' ||
            endereco.endereco_cep
        FROM uf
        INNER JOIN cidade on cidade.cidade_codigo = endereco.cidade_codigo
        INNER JOIN bairro on bairro.bairro_codigo = endereco.bairro_codigo
        WHERE uf.uf_codigo = endereco.uf_codigo
    )


Espero que ajude
Bom dia Imex, consegui gravar na base de dados

Vamos aos resultados
Da forma concatenada pesquisando %RUA%MORRETES%
TROUXE 19 RESULTADOS
Código:
SELECT
           endereco.endereco_logradouro,
           endereco.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           endereco.endereco_cep as cep
      FROM uf
INNER JOIN cidade on cidade.uf_codigo = uf.uf_codigo
INNER JOIN bairro on bairro.cidade_codigo = cidade.cidade_codigo
INNER JOIN endereco on endereco.bairro_codigo = bairro.bairro_codigo
  WHERE  (
          UPPER(endereco.endereco_logradouro
              || cidade.cidade_descricao
              || bairro.bairro_descricao
              || uf.uf_sigla
              || uf.uf_descricao) LIKE :PBUSCA_CEP
          )


Código:
Prepare time = 0ms
Execute time = 3s 719ms
Avg fetch time = 265,64 ms
Current memory = 10.095.392
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 140.524
Writes from cache to disk = 0
Fetches from cache = 4.163.297

Analise da performance das tabelas
ENDERECO = 1.104.349 INDEXADO
BAIRRO = 55.449 NÃO INDEXADO
CIDADE= 55.449 INDEXADO
UF = 55.449 INDEXADO


Pesquisando %RUA%CURITIBA%
RESULTOU EM 9.903 REGISTROS
Código:
------ Performance info ------
Prepare time = 0ms
Execute time = 625ms
Avg fetch time = 44,64 ms
Current memory = 10.100.528
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 62.973
Writes from cache to disk = 0
Fetches from cache = 1.762.493

Analise da performance das tabelas
ENDERECO = 478.331 INDEXADO
BAIRRO = 21.216 NÃO INDEXADO
CIDADE= 21.216 INDEXADO
UF = 21.216 INDEXADO


Já pesquisando assim %RUA%CURITIBA%PARANÁ%
RESULTOU EM 9393 REGISTROS
Código:
------ Performance info ------
Prepare time = 0ms
Execute time = 1s 547ms
Avg fetch time = 110,50 ms
Current memory = 10.101.856
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 63.382
Writes from cache to disk = 0
Fetches from cache = 1.763.652

Analise da performance das tabelas
ENDERECO = 478.702 INDEXADO
BAIRRO = 21.219 NÃO INDEXADO
CIDADE= 21.219 INDEXADO
UF = 21.219 INDEXADO



*********************************************************************
Da forma com o campo novo
Código:
SELECT
           endereco.endereco_logradouro,
           endereco.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           endereco.endereco_cep as cep
      FROM uf
INNER JOIN cidade on cidade.uf_codigo = uf.uf_codigo
INNER JOIN bairro on bairro.cidade_codigo = cidade.cidade_codigo
INNER JOIN endereco on endereco.bairro_codigo = bairro.bairro_codigo
WHERE endereco.endereco_completo like :PBUSCA_CEP

Código:
------ Performance info ------
Prepare time = 0ms
Execute time = 2s 578ms
Avg fetch time = 184,14 ms
Current memory = 10.091.736
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 140.524
Writes from cache to disk = 0
Fetches from cache = 4.163.297

Analise da performance das tabelas
ENDERECO = 1.104.349 INDEXADO
BAIRRO = 55.449 NÃO INDEXADO
CIDADE= 55.449 INDEXADO
UF = 55.449 INDEXADO


Abaixo usando o campo novo endereco_completo outros resultados obtidos

Pesquisando assim %RUA%MORRETES%CURITIBA%
DA NOVA FORMA CONSULTADO POR ENDERECO_COMPLETO
TOUXE 2 RESUTADOS
Código:
------ Performance info ------
Prepare time = 16ms
Execute time = 2s 594ms
Avg fetch time = 1.297,00 ms
Current memory = 10.091.560
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 140.524
Writes from cache to disk = 0
Fetches from cache = 4.163.297


Pesquisando %RUA%CURITIBA%
RESULTOU EM 9.903 REGISTROS um pouco a mais que a forma concatenada
Código:
------ Performance info ------
Prepare time = 15ms
Execute time = 453ms
Avg fetch time = 32,36 ms
Current memory = 10.096.952
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 62.956
Writes from cache to disk = 0
Fetches from cache = 1.762.460

Analise da performance das tabelas
ENDERECO = 478.320 INDEXADO
BAIRRO = 21.216 NÃO INDEXADO
CIDADE= 21.216 INDEXADO
UF = 21.216 INDEXADO


Já pesquisando assim %RUA%CURITIBA%PARANÁ%
RESULTOU EM 23 REGISTROS muito menos que da forma concatenada
Código:
------ Performance info ------
Prepare time = 0ms
Execute time = 2s 610ms
Avg fetch time = 186,43 ms
Current memory = 10.091.648
Max memory = 10.847.576
Memory buffers = 2.048
Reads from disk to cache = 140.524
Writes from cache to disk = 0
Fetches from cache = 4.163.297

Analise da performance das tabelas
ENDERECO = 1.104.349 INDEXADO
BAIRRO =55.449 NÃO INDEXADO
CIDADE= 55.449 INDEXADO
UF = 55.449 INDEXADO


Parece que quanto mais registros menos tempo leva para trazer o retorno. Isso também percebi do modo concatenado que quanto mais registros menos tempo de resposta.

Melhorou um pouco nesse segundo, não como imaginava mais já deu uma pequena diferença.

Não sei se da pra melhorar mais ainda isso.
Pois não sei como o Correios faz pq é instantâneo a consulta deles
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jul 08, 2021 10:32 am    Assunto: Responder com Citação

Experimente fazer uns testes deixando a tabela Endereco depois do From assim como estava no início do tópico já que o campo do filtro é dessa tabela:

Código:
  SELECT
           endereco.endereco_logradouro,
           endereco.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           endereco.endereco_cep as cep
      FROM endereco
INNER JOIN cidade on cidade.cidade_codigo = endereco.cidade_codigo
INNER JOIN bairro on bairro.bairro_codigo = endereco.bairro_codigo
INNER JOIN uf on uf.uf_codigo = endereco.uf_codigo     
WHERE endereco.endereco_completo like :PBUSCA_CEP


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Jul 08, 2021 11:18 am    Assunto: Responder com Citação

imex escreveu:
Experimente fazer uns testes deixando a tabela Endereco depois do From assim como estava no início do tópico já que o campo do filtro é dessa tabela:

Código:
  SELECT
           endereco.endereco_logradouro,
           endereco.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           endereco.endereco_cep as cep
      FROM endereco
INNER JOIN cidade on cidade.cidade_codigo = endereco.cidade_codigo
INNER JOIN bairro on bairro.bairro_codigo = endereco.bairro_codigo
INNER JOIN uf on uf.uf_codigo = endereco.uf_codigo     
WHERE endereco.endereco_completo like :PBUSCA_CEP


Espero que ajude
Assim ficou um pouco mais rápido

Acho que mais que isso não da mesmo né.

Aproveitando tem uma forma direta para substituir um endereço que veio assim
RUA DE DUQUE
para
RUA DUQUE DE

Assim parce não funcionar
Código:
update ENDERECO set
   endereco.endereco_logradouro = replace(endereco.endereco_logradouro, '%RUA%DE%DUQUE%', '%RUA%DUQUE%DE%');

_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jul 08, 2021 11:54 am    Assunto: Responder com Citação

Segue uma outra sugestão de testes para a consulta:

Código:
with CTE_Filtro as
(
  SELECT
           endereco_logradouro,
           endereco_complemento,
           bairro_codigo,
           cidade_codigo,
           uf_codigo,
           endereco_cep
  FROM endereco
  WHERE endereco_completo like :PBUSCA_CEP
)

  SELECT
           CTE_Filtro.endereco_logradouro,
           CTE_Filtro.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           CTE_Filtro.endereco_cep as cep
      FROM CTE_Filtro
INNER JOIN cidade on cidade.cidade_codigo = CTE_Filtro.cidade_codigo
INNER JOIN bairro on bairro.bairro_codigo = CTE_Filtro.bairro_codigo
INNER JOIN uf on uf.uf_codigo = CTE_Filtro.uf_codigo


Para o Update, experimente dessa forma:

Código:
update ENDERECO set
   endereco_logradouro = replace(endereco_logradouro, 'RUA DE DUQUE', 'RUA DUQUE DE');
where
   endereco_logradouro like '%RUA%DE%DUQUE%'


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Jul 08, 2021 12:16 pm    Assunto: Responder com Citação

imex escreveu:
Segue uma outra sugestão de testes para a consulta:

Código:
with CTE_Filtro as
(
  SELECT
           endereco_logradouro,
           endereco_complemento,
           bairro_codigo,
           cidade_codigo,
           uf_codigo,
           endereco_cep
  FROM endereco
  WHERE endereco_completo like :PBUSCA_CEP
)

  SELECT
           CTE_Filtro.endereco_logradouro,
           CTE_Filtro.endereco_complemento,
           bairro.bairro_descricao bairrodescricao,
           cidade.cidade_descricao as cidadedescricao,
           uf.uf_sigla as ufsigla,
           CTE_Filtro.endereco_cep as cep
      FROM CTE_Filtro
INNER JOIN cidade on cidade.cidade_codigo = CTE_Filtro.cidade_codigo
INNER JOIN bairro on bairro.bairro_codigo = CTE_Filtro.bairro_codigo
INNER JOIN uf on uf.uf_codigo = CTE_Filtro.uf_codigo


Para o Update, experimente dessa forma:

Código:
update ENDERECO set
   endereco_logradouro = replace(endereco_logradouro, 'RUA DE DUQUE', 'RUA DUQUE DE');
where
   endereco_logradouro like '%RUA%DE%DUQUE%'


Espero que ajude
O select ficou indiferente praticamente do anterior Imex.

O Update deu certo.
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página Anterior  1, 2
Página 2 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB