[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