[firebase-br] RES: RES: Otimizar Where

Tecnobyte Informática temp2 em tecnobyte.com.br
Ter Dez 20 09:54:00 -03 2011


Sugestão:

1. Evite usar CONTAINING, LIKE '%TEXTO%' e LIKE '%TEXTO'

2. A partir do Firebird 2.1 você também pode fazer uma pesquisa indexada 
pelo final do campo, assim:

-- Crie um índice assim:

CREATE INDEX IN_Final_Placa ON Veiculo COMPUTED(REVERSE(Placa))

-- E depois pesquise assim:

SELECT * FROM Veiculo
WHERE REVERSE(Placa) STARTING WITH REVERSE(:Parametro)

Neste caso o usuário deve digitar SEMPRE os dígitos finais da placa. É muito 
mais prático que digitar as letras da placa e consegue filtrar muito bem.

Tua aplicação também pode fazer alguns testes para determinar o tipo de 
busca que deverá fazer:

- Se o usuário digitou apenas números, use o SELECT que mostrei acima, pois 
ele está pesquisando pelo final da placa.
- Se digitou mais que 3 letras, então está pesquisando pelo nome.
- Se digitou 3 letras e 4 dígitos, então está pesquisando pelo número 
completo (letra+dígitos) da placa.
- Se digitou apenas letras, mesmo que seja 3 ou menos, provavelmente está 
pesquisando pelo nome, visto que existem muitas placas com o mesmo prefixo 
(letras).
- Se digitar 3 letras e pelo menos um dígito, então está pesquisando pelo 
início da placa.

Enfim, seguindo esta diretiva você conseguirá montar algumas regras para 
ajudar o usuário de teu sistema.

A propósito, eu gosto desta idéia de dar um pouco de inteligência ao 
sistema, pois facilita a vida do usuário (além de impressioná-lo, o que é um 
ótimo recurso de marketing).

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br

-----Mensagem Original----- 
From: Felix - Sol Informática
Sent: Tuesday, December 20, 2011 6:51 AM
To: 'FireBase'
Subject: [firebase-br] RES: RES: Otimizar Where

Magno, eh que estou tentando facilitar para o usuário; acho que um sistema
pode, em algumas circunstancias, "prever" o que o operador precisa - como
neste caso, localizar um veiculo a partir de qualquer informação.

Agora, me resta otimizar o processo do select. Realmente, 2 selects resolvem
o problema - e já uso assim em algumas partes do programa. Mas queria achar
maneira de fazer em 1 só ;-)

Fco. Felix
www.soltecnologia.com.br

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Magno System
Enviada em: segunda-feira, 19 de dezembro de 2011 23:21
Para: FireBase
Assunto: Re: [firebase-br] RES: Otimizar Where

Posso estar falando besteira mas só com dois selects, procurando primeiro
pela placa e caso não ache nenhum registro você faz um outro select
procurando pelo proprietário ou veículo. Se fosse "AND" em vez de "OR",
acredito que o FIREBIRD usaria um índice de placas (caso existisse) e se não

encontrasse nenhum registro nem pesquisaria pelo PROPRIETÁRIO e VEÍCULO,
visto que o "AND" obrigaria a placa existir (mas neste caso como você falou
a placa é única e nem necessitaria a pesquisa do PROPRIETÁRIO OU VEÍCULO).
Mas como a cláusula é OR e você tem um CONTAINING o Firebird não usará
índices para achar o PROPRIETÁRIO E VEÍCULO e obrigatoriamente percorrerá
cada registro do banco.

Acho que a melhor maneira seria o usuário selecionar o que quer pesquisar e
você fazer a pesquisa direto pelo campo que ele quer. Ou então pesquisar
pela placa e caso não encontre pelo PROPRIETÁRIO OU VEÍCULO.

Software House Magno System
Site: www.magnosystem.com.br
Email: magno em speet.com.br
Tel.: (35)3371-2337 / (35) 9129-7634


----- Original Message ----- 
From: "Felix - Sol Informática" <felix em soltecnologia.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Monday, December 19, 2011 11:01 PM
Subject: [firebase-br] RES: Otimizar Where


Campo no Delphi:

Informe Veículo: [ EdVeiculo : TEdit ] (Hint: Informe Placa ou Automovel ou
Proprietário)

Então, eu pesquiso no banco da seguinte maneira:
1. pela placa - que obviamente será única e individual - não existem 2
registros com a mesma placa;
2. pelo automóvel - poderão existir vários veículos com a descrição 'CIVIC';
3. pelo proprietário - um proprietário 'JOSE' poderá ter vários veículos
cadastrados.

Select (campos)
  from veiculo
  inner join proprietario on veiculo.codprop = proprietario.codprop
  where
     veiculo.placa = :xveiculo or
     veiculo.automovel containing :xveiculo or
     proprietario.nome containing :xveiculo

parambyname('xveiculo').asstring := EdVeiculo.Text

Caso o sistema retorne 1 só registro (em qualquer das condições acima) eu já
apresento as informações pertinentes; caso contrário é mostrada uma janela
para seleção do registro correto.

A pesquisa é feita de forma rápida, não estou reclamando do tempo; mas deve
haver uma forma de acelerar o processo, fazendo o banco trabalhar o mínimo
possível.

Seria algo como:
Se achou a placa, não precisa pesquisar mais nada; retornar registro;
Se não achou a placa, pesquisar por automóvel - retornar o(s) registro(s)
encontrado(s);
Se não achou o automóvel, pesquisar por proprietário - retornar o(s)
registro(s) encontrado(s).

Se não é possível fazer via sentença SQL, como seria uma SP para isso?
Obrigado.

Fco. Felix
www.soltecnologia.com.br

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Alysson Gonçalves de Azevedo
Enviada em: segunda-feira, 19 de dezembro de 2011 21:28
Para: FireBase
Assunto: Re: [firebase-br] Otimizar Where

Se fazer questão de que essa "escolha" seja feita no DB e não no delfão,
usa Stored Procedure Seletável...


Alysson Gonçalves de Azevedo
(11) 8491-7730



Em 19 de dezembro de 2011 21:22, Hélio Oliveira
<hpensador em gmail.com>escreveu:

> Boa noite Felix!
>
>
>
>  Estou pensando em otimizar uma consulta, que inicialmente é do tipo:
>> Select * from veiculo where placa = :xplaca OR veiculo containing
>> :xveiculo
>>
>> Acontece que se ele achar 1 registro onde [placa = :xplaca], não será
>> necessário realizar o [OR veiculo containing] que é mais demorado.
>>
>> Não pretendo fazer 2 consultas separadas; alguma sugestão?
>>
>
> Não sei qual é sua realidade, porém eu uso em situações como esta o
> seguinte: na tela de pesquisa tenho além do campo onde será digitado a
> informação a ser pesquisada um combo onde o Cliente irá dizer em qual
campo
> quer fazer a pesquisa, daí a partir do que for selecionado eu monto a
minha
> SQL dinamicamente.
>
> --
> []'s,
>
> Hélio Oliveira
> Bel. Ciência da Computação
> Técnico em Contabilidade
> e-mail : hpensador em gmail.com
> Skype : hpensador
> http://hpensador.blogspot.com/
> (71) 9975-9176
>
>
>
> ______________________________**________________
> 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<http://www.firebase.com.b
r/fb/artigo.php?id=1107>
> Para consultar mensagens antigas:
http://firebase.com.br/**pesquisa<http://firebase.com.br/pesquisa>
>
______________________________________________
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://firebase.com.br/pesquisa


______________________________________________
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://firebase.com.br/pesquisa


______________________________________________
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://firebase.com.br/pesquisa


______________________________________________
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://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista