Duvida sobre comando Like
02/06/2004
0
Eu li um artigo no site firebase onde fala sobre nao usar o comando like com parametros numa query
O artigo:[b:64a9bc23b5]
9) Não use Queries parametrizadas com o comando LIKE
A cláusula like precisa ser usada corretamente. Assumindo que voce tenha um índice para o campo lastname, o seguinte comando fará com que o IB utilize o índice :
Select * from customer where lastname like ´SCH¬´; // procure todos os clientes cujo lastname comece com ´SCH´
No entanto, o comando seguinte será lento e causará muito mais trabalho no servidor pois ele não usará um índice :
Select * from customer where lastname like ´¬SCH¬; // procure todos os clientes cujo lastname contenha ´SCH´
A única maneira do IB processar o comando acima é percorrer completamente a tabela. Isso significa que o IB irá retornar todo registro do disco para a tabela customer, para então examina-los e verificar se eles contém a palavra ´SCH´. Isso deve ser evitado pois é muito lento !
Os seguintes comandos irão causar table scans (varrimento das tabelas):
Select * from customer where lastname like :aparam ;
Isso causará um table scan pois o IB não sabe se voce irá passar um parâmetro do tipo ´SCH¬´ ou ´¬SCH¬´, portanto ele é optimizado para o pior caso, gerando um table scan.
Select * from customer where lastname like upper(´something´) ;
Não interessa o que voce envie para a função, ou o que a função faz, o IB não saberá antecipadamente o que a função retornará, portanto usará um table scan.
Select * from customer where upper(lastname) like ´¬SCH´;
A única maneira do IB determinar o resultado da função Upper(lastname) é executar o campo lastname através da função, o que causará um table scan.
Geralmente table scan são lentos, índices são rápidos. Tenha cuidado quando e como voce usa o LIKE.
[/b:64a9bc23b5]
eu faço todas as minhas consultas com opção de mostrar no grid só os registros que sastifaçam a uma condicao, que pode ser: ´os que começam com...´, ´que contenham...´ ou ´que terminem com...´, pelo o q diz no artigo somente o primeiro criterio da minha consulta é ´viavel´ isso se eu usar um indice pro campo em questão, que deixa a consulta mais rapido o resto faz o que eu nao quero q é trazer ou ler todos os registros da tabela... alguem tem alguma outra opção pra consulta ou posso desconsiderar o artigo? (obs.: eu fiz um teste com 9000 resgitros em uma tabela e eu achei que as consultas com criterio que nao era ´que comecem com...´ ficaram um pouco mais lentas)
Valew i!!!!
Dorivansousa
Posts
02/06/2004
Xisto
NOME LIKE ´SEILA¬´
Tudo o mais
- pesquisa em campo nao indexado.
- LIKE ´¬SEILA¬´
- LIKE :PARAMETRO (instrucao passada por parametro)
É tudo furada (lento)? Tô ferrado.
CASO 1
Tenho uma tabela PARADOX de 60.000 registros (sem indice) que é consultada sem o uso de LIKE. A consulta é rapida.
CASO 2
Tenho uma tabela PARADOX de 7000 registros (sem indice) que é consultada usando LIKE do mau :evil: (LIKE ´¬XXX¬´). A consulta é rapida tambem.
Se houver alguma queda na performance, acredito que so se o banco for bem grande (500.000 registros pra la).
Fiquei curioso.
02/06/2004
Dorivansousa
(fiz o teste com o servidor pentium IV 256 de ram windows 98 em um terminal duron com windows 98)
falow i!!!
02/06/2004
Afarias
LIKE ´¬nome¬´
LIKE ´¬nome´
LIKE :parametro
Isso não quer dizer q os registros serão trazidos na rede -- apenas serão visitados pelo banco de dados.
Estou falando do FB (ou do IB) -- no caso de PARADOX é outra história -- gerenciadores de arquivo são diferente.
Apenas a expressão ::
LIKE ´nome¬´
usará um índice (e será mais rápida se houver tal índice, claro!)
Me parece q o artigo citado não menciona, mas ... de desejar usar parâmetros, a chave é substituir o LIKE pelo operador STARTING WITH, ex:
SELECT * FROM TABELA
WHERE NOME STARTING WITH :parametro
o comando acima é igual a:
SELECT * FROM TABELA
WHERE NOME LIKE ´algo¬´
MAS sempre usará um índice (se existir) -- Note q este operador não deve ser usado em conjunto com curingas (¬) e serve apenas para os casos de INICIANDO COM ...
T+
31/10/2017
Wesley Rodrigues
Clique aqui para fazer login e interagir na Comunidade :)