Qual é mais rápido - Seek ou Locate

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

lapinhazzz
Usuário Nível 3
Usuário Nível 3
Mensagens: 130
Registrado em: 20 Abr 2009 10:52
Localização: LAGOA

Qual é mais rápido - Seek ou Locate

Mensagem por lapinhazzz »

Boa Tarde amigos do forum

Fiz uma pequena rotina em xharbour e estou para perceber qual é mais rápido na pesquisa e filtragem daquilo que quero ou seja entre uma data ou entre datas que é o que eu quero pesquisar.
Com locate funciona tudo muito bem.
Mas e para o comando Seek como faço. Não será mais rápido Seek do que locate que percorre a base de dados inteira.
Estou a pensar numa maneira rápida de obter a condição.
Escolhe a data e a rotina imprime o resultado da pesquisa dessa data. Se for entre datas a rotinha filtra os registos que condizem à condição e fazem o cálculo e imprimem no ecra.

Mas eu estou a prever o futuro.
Se tiver muitos registos.
Qual usar????? find, locate ou seek
E como.
Se tiverem algo diferente e rápido
Alterem o que tiverem que alterar que eu agradeço imenso
Aqui vai a rotina.
Gostaria que me dessem uma dica.

Código: Selecionar todos


function mv_c()
   para dia
   set centu off
   sele 1
   use vendas
   inde on datactual to datav
   rot="CAIXA"
   dataa=ctod('  /  /  ')
   datab=ctod('  /  /  ')
   cor(12)
   @12,14 clea to 19,50
   @12,14 to 20,50
   @10,14 say "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
   @11,14 say "³                                   ³"
   @12,14 say "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´"
   cor(12)
   cur(0)
   @13,15 say "Copias a Preto           "
   @14,15 say "Copias a Cores           "
   @15,15 say "Total de Copias          "
   @16,15 say "Valor Copias a Preto     "
   @17,15 say "Valor Copias a Cores     "
   @19,15 say "Valor Caixa:             "
   cor(21)
   IF dia=1
      cor(12)
      @ 11,15 say "Dia:"
      cor(51)
      @ 11,20 get dataa
      read
   elseif dia=2
      cor(12)
      @ 11,15 say "De:"
      @ 11,31 say "at‚:"
      cor(51)
      @ 11,20  get dataa
      @ 11,41  get datab
      read
   endif
   cor(51)
   cp=0
   cc=0
   tp=0
   tc=0
   tt=0
   tco=0
   go top
   STOR "(datactual" to b
   STOR "(datactual" to c
   STOR "(datactual" to d
   STOR ">=(dataa)) .and." to e
   STOR "<=(datab) .and. dia=2)" to f
   stor "=(dataa) .AND. dia=1)" to i
   stor d+e+d+f to g
   stor b+i to h
   *dataa=dtoc(dataa)
   *datab=dtoc(datab)
   IF dia =1
   loca for &h
   ENDIF
   IF dia=2
      loca for &g
   endif
   vez=1
   do whil .T.
      IF found()
         if &h
            cp=cp+quantp
            cc=cc+quantc
            tp=tp+totalp
            tc=tc+totalc
            tt=tt+total
            tco=tco+tcopias
         endi
         if &g
            cp=cp+quantp
            cc=cc+quantc
            tp=tp+totalp
            tc=tc+totalc
            tt=tt+total
            tco=tco+tcopias
            wait vez
            vez=2
         endi
      endi
      @ 16,20 say "quant copias pretas"+str(cp)
      @ 17,20 say  "quant copias cores"+str(cc)
      @ 18,20 say "quat pretas+quant cores total copias"+str(tco)
      @ 19,20 say "Total valor pretas"+str(tp)
      @ 20,20 say "total valor cores"+str(tc)
      @ 21,37 say "total caixa"+str(tt)
      wait" "
      cont
      IF eof()
          exit
      ENDIF
   enddo
   IF dia=1
      @11,20 say dataa
   elseif dia=2
      @11,20 say dataa
      @11,41 say datab
   endif
   cor(12)
   cur(0)
   @13,40 say str(cp)
   @14,40 say str(cc)
   @15,40 say str(tco)
   @16,37 say str(tp)
   @17,37 say str(tc)
   cor(51)
   @ 19,37 say str(tt)
   wait ""
   set cent on
   cp=0
   cc=0
   tp=0
   tc=0
   tt=0
   tco=0
   rot="MAIN"
return

Obrigado
:))
Lapinhazzz
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Qual é mais rápido - Seek ou Locate

Mensagem por Maligno »

Em qualquer sistema gerenciador de dados, a forma mais rápida de pesquisa, ou, em outras palavras, a forma que dá acesso mais rápido a um registro, é aquele que utiliza a chave de índice, que, conforme o nome diz, existe justamente para tornar o acesso mais rápido. Ou seja, SEEK é o método mais rápido.

Porém, como se trata de uma chave de índice, você não tem como criar, on-the-fly, uma condição de filtragem. A solução, usando índice, é que o índice seja criado com essa filtragem. Nem sempre isso é possível. Portanto, para a execução de um filtro, o ideal é o uso do comando FILTER.

Por outro lado, pode-se unir o melhor dos dois mundos. Regra: o FILTER será tão mais rápido quando MENOR for base de dados. Então, para torná-lo mais rápido, você pode utilizar um recurso dos índices mais novos: SET SCOPE. Esse comando faz com que a base de dados fique "virtualmente" menor. É um truque simples. Você usa SET SCOPE para limitar a "visibilidade" do FILTER. Isso faz a velocidade aumentar substancialmente.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Qual é mais rápido - Seek ou Locate

Mensagem por sygecom »

Como o Maligno disse o Seek ou DBSEEK() são mais rápido, e para filtros alem do SET SCOPE ou ORDSCOPE() tem também o OrdWildSeek() que é extremamente rápido.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Qual é mais rápido - Seek ou Locate

Mensagem por Maligno »

OrdWildSeek() não faz qualquer trabalho de filtragem. Ela faz uma busca direta, que ao que parece, não tem relação com o problema do colega.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Qual é mais rápido - Seek ou Locate

Mensagem por sygecom »

Procura no Forum que você acha uns post do Eolo, mostrando como usar para filtro.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder