[firebase-br] Opções para otimizar o first skip

Carlos H. Cantu listas em warmboot.com.br
Qua Maio 9 11:29:08 -03 2012


Acredito que parte do "problema" seja o fato de vc estar ordenando o
resultado por um conjunto de campos sendo que alguns estão em ordem
crescente e outros decrescente. Isso obrigada o Firebird a recuperar
todo o result set para ordernar da forma que vc pediu e só depois
pular o número de registros informados no skip.

Só para feito de teste, mude o order by para
ORDER BY RGESC

e certifique-se que existe um indice para esse campo, e veja se muda
alguma coisa na performance.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

GEP> é uma view grande

GEP> PLAN (L_PEDIDO_PEDIDO CIDADE INDEX (RDB$PRIMARY5))
GEP> PLAN (L_PEDIDO_PEDIDO REGIAO INDEX (RDB$PRIMARY24))
GEP> PLAN (L_PEDIDO_PEDIDO TRANSPORTADORA INDEX (RDB$PRIMARY39))
GEP> PLAN JOIN (JOIN (JOIN (JOIN (SORT (JOIN (L_PEDIDO_PEDIDO VE
GEP> NATURAL,     L_PEDIDO_PEDIDO PE INDEX (RDB$FOREIGN69,
GEP> IDX_PEDIDO2),     L_PEDIDO_PEDIDO U INDEX (RDB$PRIMARY32),
GEP> L_PEDIDO_PEDIDO CL INDEX     (RDB$PRIMARY6))), L_PEDIDO_PEDIDO BA
GEP> INDEX     (FK_BOLETO_ANTECIPADO_1)), L_PEDIDO_PEDIDO RB NATURAL),
GEP> L_PEDIDO_PEDIDO CLL INDEX (RDB$PRIMARY78)), L_PEDIDO_PEDIDO S INDEX     (RDB$PRIMARY63))


GEP> SELECT PE.IDPEDIDO, CL.RAZAO_SOCIAL, VE.RAZAO_SOCIAL, PE.VALORTOTAL,
GEP>        PE.DATA, U.USUARIO, CASE PE.TIPO WHEN 'V' THEN 'À VISTA'
GEP> WHEN     'P' THEN 'À PRAZO' WHEN 'D' THEN 'DOAÇÃO' END,
GEP>        PE.IDDEPARTAMENTO, PE.VALIDO,
GEP>        CASE PE.VALIDO_C WHEN 'F' THEN 'X' END,
GEP>        CASE PE.VALIDO_P WHEN 'F' THEN 'X' END,
GEP>        CASE PE.VALIDO_E WHEN 'F' THEN 'X' END,
GEP>        CASE PE.RGESC WHEN 0 THEN 'ANTES DE '|| EXTRACT(DAY FROM 
GEP> PE.DTESC)||'/'||EXTRACT(MONTH FROM PE.DTESC)||'/'||EXTRACT(YEAR FROM     PE.DTESC)
GEP>        WHEN 1 THEN 'EXATO EM '|| EXTRACT(DAY FROM    
GEP> PE.DTESC)||'/'||EXTRACT(MONTH FROM PE.DTESC)||'/'||EXTRACT(YEAR FROM     PE.DTESC)
GEP>        WHEN 2 THEN 'APÓS '|| EXTRACT(DAY FROM    
GEP> PE.DTESC)||'/'||EXTRACT(MONTH FROM PE.DTESC)||'/'||EXTRACT(YEAR
GEP> FROM     PE.DTESC) ELSE ' ' END,
GEP>        CL.IDREGIAO, PE.IDUSUARIO, PE.DTESC, PE.RGESC,
GEP>        S.DESCRICAO,
GEP>         PE.IDTRANSPORTADORA,
GEP>        (SELECT CASE TR.FANTASIA WHEN '' THEN TR.RAZAO_SOCIAL
GEP> ELSE     TR.FANTASIA END FROM TRANSPORTADORA TR WHERE
GEP> TR.IDTRANSPORTADORA =     PE.IDTRANSPORTADORA),
GEP>        (SELECT R.DESCRICAO FROM REGIAO R WHERE R.IDREGIAO =     CL.IDREGIAO),
GEP>        (SELECT CI.MUNICIPIO || '-' || CI.SIGLA FROM CIDADE CI
GEP> WHERE     CI.IDCIDADE = CL.IDCIDADE3),
GEP>        CASE ba.ADC_LIQUIDACAO 
GEP>        WHEN 'A' THEN CASE CLL.RECURSO WHEN 'C' THEN 'C' WHEN 'D' THEN 'D' ELSE 'A' END
GEP>        WHEN 'C' THEN 'C' WHEN 'D' THEN 'D' END
GEP>        FROM PEDIDO PE 
GEP>        inner join CLIENTE CL on pe.IDCLIENTE = cl.IDCLIENTE
GEP>        inner join VENDEDOR VE on pe.IDVENDEDOR = ve.IDVENDEDOR
GEP>        inner join USUARIO U on pe.IDUSUARIO = u.IDUSUARIO
GEP>        left outer join BOLETO_ANTECIPADO BA ON PE.IDPEDIDO =     BA.IDPEDIDO
GEP>        left outer join RETORNO_BANCARIO rb on rb.IDPEDIDO =    
GEP> ba.IDPEDIDO and rb.IDPRESTACAO = ba.IDPRESTACAO       
GEP>        left outer join CODIGO_LIQUIDACAO cll on cll.IDLIQUIDACAO
GEP> =     RB.IDLIQUIDACAO AND CLL.IDBANCO = RB.IDBANCO
GEP>        left outer join STATUS S on s.IDSTATUS = pe.IDSTATUS
GEP>        where pe.iddepartamento in(1,2,3,4,5);



GEP> Em 08-05-2012 17:45, Carlos H. Cantu escreveu:  
GEP>   
GEP> Qual é o PLAN retornado?

GEP> []s
GEP> Carlos H. Cantu
GEP> www.FireBase.com.br - www.firebirdnews.org
GEP> www.warmboot.com.br - blog.firebase.com.br

G>> Olá pessoal, criei uma classe para paginar os registros na grade, q 
G>> devolve algo assim:

G>> select first 9 skip 225 *  from L_PEDIDO_PEDIDO  where  IDDEPARTAMENTO =
G>> '3'  ORDER BY RGESC  ASC, DTESC ASC, pedido ASC

G>> o problema é q qto mais alto o valor de skip, mais lento fica a consulta !

G>> sei q o Firebird lê tudo antes de devolver o q esta dentro de first e skip,
G>> mas tem algum outro jeito pra otimizar isto ? ou não tem jeito ?

G>> grato qq ajuda


GEP> ______________________________________________
GEP> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
GEP> Para saber como gerenciar/excluir seu cadastro na lista, use:
GEP> http://www.firebase.com.br/fb/artigo.php?id=1107
GEP> Para consultar mensagens antigas: http://firebase.com.br/pesquisa


GEP>   
GEP>   
GEP>   
GEP>   





Mais detalhes sobre a lista de discussão lista