[firebase-br] Forçando indíces

Eduardo Jedliczka edujed em gmail.com
Qui Fev 14 09:28:35 -03 2008


Eu estou BEEEEM atrasado na minha resposta, mas vamos por partes...

Muitos já disseram que o FB não usa indice para o like, e é verdade.

mas você tem muitos JOINS implicitos neste select e reescrevê-los como
joins explicitos podem deixar o select mais claro, legível, e dependendo
dos parâmetros (principalmente no FB 1.X), gerar um plan melhor.

Além do like ainda há um péssimo hábito de usar and e or para os
parâmetros (OMITE, MERCADO), o que confunde muito o otimizador do FB, e
faz com que ele, eventualmente, desista de usar qualquer plan.

A minha sugestão para se conseguir uma boa performance é, pela aplicação
(ou de dentro de uma stored procedure) alterar o select para fazer
APENAS o que precisa ser feito... esta estória de SELECTS GENÉRICOS é
furada... é bom num sistema pequeno, mas testa isto daí com alguns
milhões de registros....

sucesso,

Eduardo Jedliczka

Em Qua, 2008-02-06 às 15:26 -0200, Alexandre Sousa escreveu:
> Olá a todos,
> 
> Reabrindo um tópico que ja apareceu na lista mas que não achei resposta.
> 
> Tenho a seguinte consulta:
> 
> select pr.PRODUTO, pr.PR_DESCR, pr.EMPENHO, pr.REFER1, pr.EST_MIN,
>   pr.PESO, pr.ESTOQUE, pr.QT_SM, pr.CUSTO, pr.VL_MEDIO, pr.UMREF,
>   pr.GRUPO, pr.SUBGRUPO
> from PRODUTO pr
> where
>   (((pr.TIPO_MOVES = 1) and (:OMITE = 1)) or (:OMITE = 0)) and
>   (((pr.MERCADO = 0) and (:MERCADO = 1)) or (:MERCADO = 0)) and
>   (pr.PRODUTO like :PRODUTO)
> 
> Devido a estrutura parametrizada e o uso do like, o firebird não utiliza o indice que tenho no campo PRODUTO.
> 
> Tentei forçar o indice utilizando a instrução PLAN da seguinte forma:
> 
> select pr.PRODUTO, pr.PR_DESCR, pr.EMPENHO, pr.REFER1, pr.EST_MIN,
>   pr.PESO, pr.ESTOQUE, pr.QT_SM, pr.CUSTO, pr.VL_MEDIO, pr.UMREF,
>   pr.GRUPO, pr.SUBGRUPO
> from PRODUTO pr
> where
>   (((pr.TIPO_MOVES = 1) and (:OMITE = 1)) or (:OMITE = 0)) and
>   (((pr.MERCADO = 0) and (:MERCADO = 1)) or (:MERCADO = 0)) and
>   (pr.PRODUTO like :PRODUTO)
> 
> PLAN (PR INDEX (IDX_PRODUTO))
> 
> mas obtive o seguinte erro:
> 
>   index  cannot be used in the specified plan
>   .
>   index RDB$PRIMARY54 cannot be used in the specified plan.
> 
> 
> Alguém tem alguma idéia?
> 
> Desde já agradeço.
> 
> 
> Att.
> 
> Alexandre Sousa Dantas
> ______________________________________________
> 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