[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