Duvida sobre comando Like

Firebird

02/06/2004

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

Curtidas 0

Respostas

Xisto

Xisto

02/06/2004

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.


GOSTEI 0
Dorivansousa

Dorivansousa

02/06/2004

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!!!


GOSTEI 0
Afarias

Afarias

02/06/2004

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+


GOSTEI 0
Wesley Rodrigues

Wesley Rodrigues

02/06/2004

Como faço para fazer um like, quando quiser col1 like col2???
GOSTEI 0
POSTAR