Outro detalhe que me chamou a atenção !!!!!!!!!!!!!!
A velocidade de gravação.
Para gravar 10.000 registros com insert, tempos em segundos.
Vejam a EXTREMA diferença dos números. É inacreditável.
Somando ainda a grande instabilidade de desempenho entre uma medição e outra do ODBC !!!
ODBC-----------------FB
10.000----------------10.000 registros gravados
59,242----------------1,706 segundos
80,548----------------1,538 segundos
43,343----------------1,715 segundos
26,399----------------1,741 segundos
37,992----------------1,581 segundos
33,513----------------1,733 segundos
47,371----------------1,741 segundos
39,009----------------1,714 segundos
37,503----------------1,592 segundos
28,865----------------1,692 segundos
Concluindo:
Quem precisa de velocidade DEVE usar a FB direto, SEM ODBC. Aos meus Gurus de SGDB's, tem algum erro nesta minha conclusão ????
Detalhes: Não encontrei qualquer referência à possibilidade de uso do ROLLBACK com o ODBC.
Parece que não há necessidade de "commitar" os dados gravados com ODBC.
No FB exige, pois sem o COMMIT os dados não são gravados.
Abaixo o PRG usado para o caso do ODBC:
RDDINFO(RDDI_EXECUTE, "CREATE TABLE Teste_ODBC ( CLIENTE char(10), CIDADE char(20) )" )
c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm1 := DateTime()
? "Time Inicial..:>"
?? c_Time1
*
FOR xx1 = 1 TO 10000
cd1 := "1" + StrZero( xx1, 09 )
cd2 := "2" + StrZero( xx1, 19 )
RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( CLIENTE, CIDADE ) values( '&cd1', '&cd2' )" )
NEXT xx1
c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm2 := DateTime()
? "Time Inicial...:>" + c_Time1,
? "Time Final.....:>" + c_Time2,
? "Total....:>"
?? c_Tm2 - c_Tm1, " dias == ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"
E abaixo o código para o FB sem ODBC:
trans := FBStartTransaction( db )
FBQuery( db, "CREATE TABLE Teste_Dbas( COD int, CLIENTE char(20), CIDADE char(25) )", nDialect, trans )
FBCommit( trans )
*
c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm1 := DateTime()
? "Time Inicial..:>"
?? c_Time1
*
trans := FBStartTransaction( db )
FOR xx1 = 1 TO 10000
cd1 := "1" + strzero( xx1, 09 )
cd2 := "2" + strzero( xx1, 19 )
FBExecute( db, 'insert into Teste_Dbas(COD, CLIENTE, CIDADE) values( "&xx1" as integer, "&cd1", "&cd2")', nDialect, trans )
NEXT xx1
FBCommit( trans )
c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
c_Tm2 := DateTime()
? "Time Inicial...:>" + c_Time1,
? "Time Final.....:>" + c_Time2,
? "Total....:>"
?? c_Tm2 - c_Tm1, " dias == ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"