[firebase-br] Ordenar depois de filtrar... Somente via especificação explicita da PLAN?

Fernando Reis Guimarães fernandobhz em gmail.com
Qui Jan 4 18:05:22 -03 2007


Olá pessoal.

A algum tempo atras tive um problema de performance com order by juntamente
com joins...
O negocio e que o firebird gerava um plano para primeiro ordernar e depois
fazer o join...
Resolvi isso utilizando a PLAN gerada sem o order by para quando utilizava o
order by....

PERGUNTO:
Existe alguma maneiro de dizer ao servidor firebird para seguir um caminho
para fazer o plano e não outro...

PORQUE:
Hoje meu plano está assim:
PLAN JOIN (V_CMI CLL INDEX (C2H_CLL_MEDIDOR), V_CMI CMI INDEX (PK_C2H_CMI))
Esse plano é executado com 15ms, mas tenho que especificalo

Sem especificar o plano gerado é:
PLAN JOIN (V_CMI CLL ORDER C2H_CLL_MESANO INDEX (C2H_CLL_MEDIDOR), V_CMI CMI
INDEX (PK_C2H_CMI))
E esse plano é bem pior que o outro, ele demora mais de 1 s

Ficou confuso?


A SQL é :
select
    CASE (Extract(Month from MesAno))
      WHEN 1 THEN '01/' || (Extract(Year from MesAno))
      WHEN 2 THEN '02/' || (Extract(Year from MesAno))
      WHEN 3 THEN '03/' || (Extract(Year from MesAno))
      WHEN 4 THEN '04/' || (Extract(Year from MesAno))
      WHEN 5 THEN '05/' || (Extract(Year from MesAno))
      WHEN 6 THEN '06/' || (Extract(Year from MesAno))
      WHEN 7 THEN '07/' || (Extract(Year from MesAno))
      WHEN 8 THEN '08/' || (Extract(Year from MesAno))
      WHEN 9 THEN '09/' || (Extract(Year from MesAno))
      WHEN 10 THEN '10/' || (Extract(Year from MesAno))
      WHEN 11 THEN '11/' || (Extract(Year from MesAno))
      WHEN 12 THEN '12/' || (Extract(Year from MesAno))
      ELSE '00/' || (Extract(Year from MesAno))
    END MesByYear,
    LEITURA,
    OC1,
    CONSUMO,
    SUBSTRING(((INDICE-1)*100) FROM 1 FOR 4) || '%' INDICE,
    LEITURISTA,
    SITUACAO,
    ENDERECO,
codcll,
substring(REFERENCIA from 1 for 5) || '-' ||
substring(REFERENCIA from 6 for 2) || '-' ||
substring(REFERENCIA from 8 for 2) || '-' ||
substring(REFERENCIA from 10 for 4) || '-' ||
substring(REFERENCIA from 14 for 1) Referencia,
Referencia CodRef,
    MEDIDOR,
    MESANO,
    NOME
from v_cmi
where medidor = :medidor



-- 
Atenciosamente,
Fernando Reis Guimarães.

Contatos
fernando em fernandobhz.com
http://www.fernandobhz.com
Celular 9213-3727.



Mais detalhes sobre a lista de discussão lista