[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