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

Gugui suporte em emar.com.br
Qua Maio 9 13:09:53 -03 2012


fiz o teste, melhora um pouco só ! (ja existe o indice para RGESC)
na verdade eu preciso dessa ordenação e então
criei tbem um indice com os campos (RGESC, DTESC, pedido)
performance ficou na mesma tbem !

o problema é q o usuario pode clicar no titulo do grid invertendo a 
ordem de A a Z ou de Z a A
nesta grade tenho 13 colunas q podem ser ordenadas assim ASC ou DESC
o q é o correto ? criar os indices para cada possibilidade de clique do 
usuario nessas colunas ?
os indices devem ser compostos igual como ficara no ORDER BY ? ou por 
cada coluna ?

muito grato



Em 09-05-2012 11:29, Carlos H. Cantu escreveu:
> 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>
>
>
> ______________________________________________
> 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