Duvida sobre comando Like

02/06/2004

0

Olá pessoal! blz?

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

Dorivansousa

Responder

Posts

02/06/2004

Xisto

Perai ...

NOME LIKE ´SEILA¬´
com um indice no campo NOME é do bem e seremos todos felizes.

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.


Responder

02/06/2004

Dorivansousa

eu fiz um teste com (like = ¬valor¬) com 9000 registro usando firebird, nao é leeeento mas realmente demora mais que (like = valor¬) com a coluna indexada, o banco de dados tambem vai otimizando a consulta e a segunda vez em diante ela fica um pouco mais rapida, mas mesmo assim é mais lento que (like = valor¬) retornando o mesmo numero de registro, pra mim isso nao é novidade pois a coluna indexada fica bem rapido mesmo... o que eu nao gostei é o fato do banco ter q carregar todos os registro e ai depois mostrar o que sastifazem a consulta e pelo o q entendi com a coluna indexada isso nao acontece. e eu fiquei sem saber se o table scans carrega os dados pela rede ou no proprio servidor e envia pela rede a apenas os registros que sastifazem a consulta...

(fiz o teste com o servidor pentium IV 256 de ram windows 98 em um terminal duron com windows 98)

falow i!!!


Responder

02/06/2004

Afarias

As expressões abaixo exigem completa varredura da tabela (ou seja, não usam índices mesmo q existam) ::

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+


Responder

31/10/2017

Wesley Rodrigues

Como faço para fazer um like, quando quiser col1 like col2???
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar