[firebase-br] Forçando indíces

Alexandre Sousa dave.malkavian em gmail.com
Qui Fev 14 10:52:08 -03 2008


Muito obrigado Eduardo.

A dica foi muito bem vinda.

Atenciosamente,

Alexandre Sousa Dantas


----- Original Message ----- 
From: "Eduardo Jedliczka" <edujed em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, February 14, 2008 8:28 AM
Subject: Re: [firebase-br] Forçando indíces


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


______________________________________________
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