[firebase-br] Forçando indíces

Fausto fausto.s.a em uol.com.br
Qui Fev 14 10:18:49 -03 2008


Desculpe a ignorância, mas onde tem Join implicito no exemplo que ele 
passou?
Fausto
Eduardo Jedliczka escreveu:
> 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