Clipper On Line • Ver Tópico - ajuda SQL perda de velocidade

ajuda SQL perda de velocidade

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

ajuda SQL perda de velocidade

Mensagempor Amparo » 05 Mai 2014 19:11

ola amigos

tenho dois programas idênticos compilados com Harbour MiniGUI Extended Edition 2.3.3 - 2014.03.20 um estou usando tabelas DBF outro MariaDB

quando abro a tela de cadastro de clientes em DBF o tempo para executar determinada rotina é de menos de 1 segundo ( 18:39:55 a 18:39:55 ), rapidinho ele me mostra os resultados que preciso, mas executando esta mesma rotina usando MariaDB o tempo passa para 23 segundos (18:39:13 a 18:39:36), poxa perece pouco mas comparado com um sistema feito em DBF é muito, tenho também o mesmo sistema com a mesma rotina feito em harbour e o tempo também é menos de 1 segundo.

eu não sei se é cansaço mas já revirei de tudo quanto foi jeito para achar o porque desta demora e não consegui, talvez seja até pelo fato de que eu ainda estou aprendendo a usar SQL, talvez!

vou colocar abaixo PRIMEIRO a rotina que esta funcionando em DBF depois a rotina feito em SQL, eu agradeço se alguém puder me ajudar.

ROTINA EM DBF
TIMEINI := TIME()

f := MLCOUNT( ALLTRIM( FORMULARIOS->TB_FIELDS ), 250 )

FOR x := 1 TO f STEP 1
  nOk := 0
  cStr := RTRIM( MEMOLINE( FORMULARIOS->TB_FIELDS, 250, x ) )

  IF cStr = "//" .OR. EMPTY( cStr )
     LOOP
  ENDIF

  cField  := RETSTR( cStr, "F:" )
  cAlias  := RETSTR( cStr, "A:" )

  IF EMPTY( cAlias )
     cAlias := SGC020101AFUNC[1]
  ENDIF

  IF cAlias <> "Calculada"
     IF ( cAlias )->( FIELDPOS( cField ) ) = 0
        nOk := 2
     ELSE
        nOk := CheckUser( ALLTRIM( cAlias ), ALLTRIM( cField ) )
     ENDIF
  ENDIF

  IF nOk < 2 .OR. cAlias = "Calculada"
     IF lAdmin .AND. nOk = 0 .AND. cAlias == SGC020101AFUNC[1]
        CAMPOS->( DBEVAL( { || lEdit := CAMPOS->FD_CHANGE },{ || RTRIM( CAMPOS->FD_NAME ) == ;
       cField .AND. RTRIM( CAMPOS->FD_FILE ) == cAlias } ) )
        ENDIF

        AADD( SGC020101AFUNC[14],;
        { cField ,;                             //01 CAMPO
        RETVAL( cStr, "L:" ),;            //02 TAMANHO DO CAMPO
        RETSTR( cStr, "H:" ),;           //03 NOME DO CABECALHO DA COLUNA
        RETSTR( cStr, "P:" ),;           //04 E A PICTURE
        .F.                 ,;                   //05
        cAlias              ,;                 //06 ALIAS
        RETSTR( cStr, "B:" ),;          //07 CONDICAO PARA APLICAR CORES NA COLUNA
        RETSTR( cStr, "C:" ),;          //08 COR DA COLUNA X
        lEdit               ,;                 //09 SE É UMA COLUNA PARA EDIÇÃO SEMPRE SERA .F.
        RETSTR( cStr, "T:" ),;          //10 TIPO DA COLUNA NUMERICA CARACTERE LOGICO MEMO
        RETSTR( cStr, "Y:" ),;          //11 PRIMEIRA CONDICAO PARA COLUNA CALCULADA
        RETSTR( cStr, "Z:" ),;          //12 SEGUNDA CONDICAO PARA COLUNA CALCULADA
        RETSTR( cStr, "D:" ),;          //13 PRIMEIRA CONDICAO PARA CORES CONDICIONAIS
        RETSTR( cStr, "E:" ),;          //14 SEGUNDA CONDICAO PARA CORES C0NDICIONAIS
        .F. ;                                    //15 FLAG PARA VERIFICAR SE O CAMPOS ESTA SOMADO OU NAO
        } )
     ENDIF
   NEXT x
MSGINFO( TIME() + QUEBRA + TIMEINI )


ROTINA EM SQL
TIMEINI := TIME()
   f := MLCOUNT( ALLTRIM( TBFIELDS ), 250 )

   FOR x := 1 TO f STEP 1
     nOk := 0
     cStr := RTRIM( MEMOLINE( TBFIELDS, 250, x ) )

     IF cStr = "//" .OR. EMPTY( cStr )
        LOOP
     ENDIF

     cField  := RETSTR( cStr, "F:" )
     cAlias  := RETSTR( cStr, "A:" )

     IF EMPTY( cAlias )
        cAlias := AFUNC[01]
     ENDIF

     IF cAlias <> "Calculada"
        MSELE := "SELECT * FROM " + cAlias
   
        SELE_ALIAS_QUERY := OSERVER:QUERY( MSELE )

        IF SELE_ALIAS_QUERY:NETERR()
           MSGSTOP( "Erro ao abrir tabela de " + cAlias + "!!!" + QUEBRA + SELE_ALIAS_QUERY:ERROR() + QUEBRA + ALLTRIM( PROCNAME(0) ) + "(" + STRZERO( PROCLINE(0),4) +")", MSIST )
        ENDIF

        IF SELE_ALIAS_QUERY:FIELDPOS( cField ) = 0
           nOk := 2
        ELSE
           nOk := CheckUser( ALLTRIM( cAlias ), ALLTRIM( cField ) )
        ENDIF

        SELE_ALIAS_QUERY:DESTROY()
     ENDIF

     IF nOk < 2 .OR. cAlias = "Calculada"
        IF lAdmin = "T" .AND. nOk = 0 .AND. cAlias == AFUNC[01]
           SELE_CAMPOS_QUERY := OSERVER:QUERY("SELECT * FROM CAMPOS WHERE FD_FILE = '" + cAlias + "' AND FD_NAME = '" + cField + "'" )

           IF SELE_CAMPOS_QUERY:NETERR() .OR. SELE_CAMPOS_QUERY:LASTREC() = 0
              lEdit := .F.
           ELSE
              ROWS_CAMPOS_QUERY := SELE_CAMPOS_QUERY:GETROW( 1 )
 
              lEdit := IIF( ROWS_CAMPOS_QUERY:FIELDGET("FD_CHANGE") = "T",.T.,.F. )
           ENDIF

           SELE_CAMPOS_QUERY:DESTROY()
        ENDIF

        AADD( AFUNC[14],;
        { cField ,;            //01 CAMPO
        RETVAL( cStr, "L:" ),; //02 TAMANHO DO CAMPO
        RETSTR( cStr, "H:" ),; //03 NOME DO CABECALHO DA COLUNA
        RETSTR( cStr, "P:" ),; //04 E A PICTURE
        .F.                 ,; //05
        cAlias              ,; //06 ALIAS
        RETSTR( cStr, "B:" ),; //07 CONDICAO PARA APLICAR CORES NA COLUNA
        RETSTR( cStr, "C:" ),; //08 COR DA COLUNA X
        lEdit               ,; //09 SE É UMA COLUNA PARA EDIÇÃO SEMPRE SERA .F.
        RETSTR( cStr, "T:" ),; //10 TIPO DA COLUNA NUMERICA CARACTERE LOGICO MEMO
        RETSTR( cStr, "Y:" ),; //11 PRIMEIRA CONDICAO PARA COLUNA CALCULADA
        RETSTR( cStr, "Z:" ),; //12 SEGUNDA CONDICAO PARA COLUNA CALCULADA
        RETSTR( cStr, "D:" ),; //13 PRIMEIRA CONDICAO PARA CORES CONDICIONAIS
        RETSTR( cStr, "E:" ),; //14 SEGUNDA CONDICAO PARA CORES C0NDICIONAIS
        .F. ;                  //15 FLAG PARA VERIFICAR SE O CAMPOS ESTA SOMADO OU NAO
        } )
     ENDIF
   NEXT x

MSGINFO( TIME() + QUEBRA + TIMEINI + QUEBRA + ALLTRIM( PROCNAME(0) ) + "(" + STRZERO( PROCLINE(0),4) +")", MSIST )
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ajuda SQL perda de velocidade

Mensagempor alxsts » 05 Mai 2014 20:54

Olá!

Não conheço este "SQL" que você está usando. Deve ser um desses wrappers para se usar com sintaxe xBase. Pessoalmente prefiro usar SQL mesmo, via ADO executando procedures compiladas no banco de dados.

Independentemente do modo de acesso à sua base relacional SQL, a performance vai estar intimamente ligada ao modelo de dados criado.

Através do código que você postou não é possível ver qual é o layout da tabela que você usa e nem sua chave primária e índices. A performance da aplicação depende muito desses 2 fatores. Verifique.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ajuda SQL perda de velocidade

Mensagempor Amparo » 06 Mai 2014 07:05

ola amigos

ola, Alexandre tudo bem com você?

uso desta forma pelo simples fato de não conhecer SQL e peguei o exemplo na pasta SAMPLES da Minigui, fiz alguns testes, mas agora que estou colocando a mão na massa para converter o programa para SQL é que estou encontrando varias dificuldades.

nunca usei ADO também não sei como funciona, se você tiver algum exemplo de conexão, criação da base, tabelas, índices como percorrer registro em uma tabela, ou seja algum material que eu possa estudar e substituir os comando utilizados para acesso e manipulação dos DBF ficarei grato pela ajuda.

abraços
Amparo
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ajuda SQL perda de velocidade

Mensagempor Amparo » 06 Mai 2014 08:16

ola amigos

gostaria de acrescentar um detalhe, criei a variável MSELE da seguinte forma, veja a diferença entre elas:
MSELE := "SELECT * FROM CLIENTES"
SELE_ALIAS_QUERY := OSERVER:QUERY( MSELE ) ( aqui a demora é de 23 segundos)

MSELE := "SELECT * FROM CLIENTES USE INDEX (CODIGO) WHERE REG_EDIT = '1'"
SELE_ALIAS_QUERY := OSERVER:QUERY( MSELE ) ( aqui baixou para 13 segundos)

MSELE := "SELECT * FROM CLIENTES WHERE REG_EDIT = '1'"
SELE_ALIAS_QUERY := OSERVER:QUERY( MSELE ) ( aqui baixou para 1 segundos)

nesta rotina que passei eu apenas quero pegar a posição de alguns campos para controle do meu sistema, ate aqui, tudo bem resolve meu problema usando a clausula WHERE, MAS, estou preocupado na hora de mostrar no TSBROWSE ou na GRID (ainda não escolhi o que vou usar) vou pegar quase 70.000 registro talvez usando o ÍNDICE abaixe um pouco o tempo, mesmo assim não é aceitável, pois em harbour usando DBF eu abro 66937 registro em menos de 2 segundos.

isso esta me preocupando e muito, o meu sistema esta funcional em harbour usando DBF e vocês sabem muito bem o trabalho que da para converter em minigui usando SQL, temo em continuar a conversão, mas não vou desistir, espero ainda encontrar uma solução.

abraços
Amparo
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

ajuda SQL perda de velocidade

Mensagempor RamonXHB » 06 Mai 2014 17:16

Qual o motivo de se apresentar 70.000 registros em um tsbrowse ou grid ?
Ramon A. Körber Jr.
Harbour 3.2 MiniGUI Extended Edition
xDevStudio v0.70 - BCC 5.82 - Lazarus FreePascal
Firebird
AdoDB - ODBC
Windows - Linux
Linux User Number 404280
MSN - ramon15061959@hotmail.com
Skype - ramon15061959
ICQ - UIN 82580595
Avatar de usuário

RamonXHB
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 152
Data de registro: 03 Mar 2007 14:55
Curtiu: 10 vezes
Mens.Curtidas: 3 vezes

ajuda SQL perda de velocidade

Mensagempor alxsts » 06 Mai 2014 23:25

Olá!

RamonXHB escreveu:Qual o motivo de se apresentar 70.000 registros em um tsbrowse ou grid ?


Realmente não faz sentido...

Amparo escreveu:se você tiver algum exemplo de conexão, criação da base, tabelas, índices como percorrer registro em uma tabela, ou seja algum material que eu possa estudar e substituir os comando utilizados para acesso e manipulação dos DBF ficarei grato pela ajuda.

Dentro da minha limitação de tempo, vou ver o que consigo.

Costumo indicar w3schools.com/. Veja o menu na lateral esquerda da página, principalmente os itens "Learn SQL" e "Learn ADO".

Editado para corrigir link.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

ajuda SQL perda de velocidade

Mensagempor Amparo » 07 Mai 2014 19:08

ola amigos

concordo plenamente com vocês, 1.000 registro já é um absurdo, a pessoa que abrir a tela vai ficar o dia inteiro baixando as linhas para olhar não sei o que, mas CLIENTE pede, to tentando mudar a cabeça dos caras, já falei pra ele você tem 70.000 cliente cadastrado e muitos inativos e não vende nem para 700 clientes, mas o cara é cabeça dura.

bem voltando ao assunto, ainda estou com minha cabeça focada em DBF as consulta ali é um pouco limitada em SQL tem um leque delas só preciso aprender um pouco mais para usa-las.

to na luta

Abraços
Amparo
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro