Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO][LUNGO] metodi Execute e AddNew

ho fatto una prova per vedere che differenza c'è in termini di
velocità di esecuzione fra eseguire tot inserimenti in una tabella usando
il metodo execute degli oggetti command e connection, e il metodo
addnew di un oggetto recordset....
ho provato ad inserire con un ciclo di for 1.000.001 record
in una tabella composta da un solo campo di tipo long
database Access'97
Parametri della connessione:
    .CommandTimeout = 30
    .ConnectionTimeout = 30
    .CursorLocation = adUseServer
    .Mode = adModeReadWrite
Parametri oggetto command:
    .CommandTimeout = 30
    .CommandType = adCmdText
    Set .ActiveConnection = myCnt
Parametri oggetto recordset
    .CursorLocation = adUseServer
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
    Set .ActiveConnection = myCnt
    .Open <NomeTabella>
Inserimento con oggetto command
MinLng = 
(-2147483648
#)
For i = MinLng To -
2146483648
#
    With myCmd
        .CommandText = "INSERT INTO <Tabella>(<NomeCampo>) VALUES
                                    (" & i & ")"
        Call .Execute
    End With
 Next i
Inserimento con oggetto recordset
MinLng = 
(-2147483648
#)
For i = MinLng To -
2146483648
#
    With myRs
        .AddNew
        .Fields("Counter_ex") = i
    End With
 Next i
myRs.Update
Inserimento con oggetto connection
MinLng = 
(-2147483648
#)
For i = MinLng To -
2146483648
#
    With myCnt
        Call .Execute("INSERT INTO Tabella1 (Counter_Ex) VALUES
                            (" & i & ")")
    End With
next i
non fate caso agli indici negativi usati, la finalità del test non era solo
"misurare" le prestazioni
i tempi di esecuzione sono stati:
Oggetto Command: 52' 47"
Oggetto Recordset: 03' 03"
Oggetto Connection: interrotto dopo 07' 00" e 104.315 record,
in proiezione circa 60'
indipendentemente dal risultato assoluto, è normale
che ci sia tutta questa differenza nella velocità di esecuzione
a favore del metodo AddNew dell'oggetto recordset e che quindi
sia sempre conveniente usarlo al posto del metodo execute?
--
bye BlackMagic
ICQ#:85485468

 sia sempre conveniente usarlo al posto del metodo execute?
Grazie per questo post (che ovviamente ci butteremo in molti a ripetere).
No, IMHO, non c'è alcuna giustificazione "logica" perchè vi siano queste
assurde differenze, se non quella che ... etc., etc., ma qui si dice spesso
di non usare il Command (io non ne conosco nemmeno la sintassi, così come
non conosco quella della Connection), in ogni caso mi consola che il
Recordset (l'unico che uso) sia il più performante.

Prova anche con adOpenStatic, per l'oggetto Recordset

 'myRs.Update    'Commentata

 ha scritto nel messaggio
news:byLH9.60999$2B1.1...@twister2.libero.it...

inizialmente avevo fatto così, solo poi ho tolto
myrs.update dal For, perchè ogni AddNew automaticamente
esegue l'update in sospeso....
fuori dal ciclo mi serve per eseguire l'update dell'ultimo AddNew
(Discorso incasinato).....
farò le prove che mi hai segnalato... poi ti faccio sapere come è andata


 farò le prove che mi hai segnalato... poi ti faccio sapere come è andata
Te ne sarei grato.

 addnew di un oggetto recordset....
Prova ad inserire 60 campi alla volta, non vorrei dire una boiata però
per me il connection è il più veloce, anzi, il command, se usato bene,
perchè non deve ricompilare ogni volta il comando.
Di sicuro una istruzione Sql su 60 campi è più veloce di un addnew su 60
fields del recordset...
Anzi, ho modificato molti programmi, proprio per questo.
Per non contare che un recordset lo devi per forza aprire prima di fare
l'addnew, se invece lanci un'istruzione sql non devi aprire un bel
niente, e non è una differenza da poco.
Ciao


con adOpenStatic il tempo è di 08' 45" però in questo caso
il test è stato penalizzato perchè il PC non era dedicato al 100%
all'elaborazione quindi il risultato potrebbe essere migliore...


 ha scritto nel messaggio
news:aso2ld$d8e$1...@grillo.cs.interbusiness.it...

proverò anche questo... tanto che anche io sono rimasto sorpreso
dai risultati... fino ad ora, quando ho potuto, ho usato
i vari metodi .Execute :-((


 all'elaborazione quindi il risultato potrebbe essere migliore...
Bene, comunque "in linea" con l'altro (03.03). Grazie.

 ha scritto nel messaggio
news:aso2ld$d8e$1...@grillo.cs.interbusiness.it...

ho provato con 20 campi (long) e non 60 :)))
sempre 1.000.000 di inserimenti
--------------------------------
oggetto recordset:
For i = MinLng To IndexEnd
    With myRs
        .AddNew
        .Fields("Campo01") = i
        .Fields("Campo02") = i + 1
        .Fields("Campo03") = i + 2
        .Fields("Campo04") = i + 3
        .Fields("Campo05") = i + 4
        .Fields("Campo06") = i + 5
        .Fields("Campo07") = i + 6
        .Fields("Campo08") = i + 7
        .Fields("Campo09") = i + 8
        .Fields("Campo10") = i + 9
        .Fields("Campo11") = i + 10
        .Fields("Campo12") = i + 11
        .Fields("Campo13") = i + 12
        .Fields("Campo14") = i + 13
        .Fields("Campo15") = i + 14
        .Fields("Campo16") = i + 15
        .Fields("Campo17") = i + 16
        .Fields("Campo18") = i + 17
        .Fields("Campo19") = i + 18
        .Fields("Campo20") = i + 19
    End With
Next i
myRs.Update
con queti risultati per tipo di cursore:
dinamico: 08' 04"
statico: 13' 08"
keyset: 13' 12"
ForwardOnly: 08' 01"
---------------------------------------
oggetto command:
For i = MinLng To IndexEnd
    With myCmd
        .CommandText = ("INSERT INTO Tabella1 (Campo01, Campo02,
Campo03, Campo04, Campo05, Campo06, Campo07, Campo08, Campo09,
Campo10, Campo11, Campo12, Campo13, Campo14, Campo15, Campo16,
Campo17, Campo18, Campo19, Campo20) " & _
                    "VALUES (" & i & ", " & i + 1 & ", " & i + 2 & ", " & i
+ 3 & ", " &
i + 4 & ", " & i + 5 & ", " & i + 6 & ", " & i + 7 & ", " & i + 8 & ", " & i
+ 9 & ",
" & i + 10 & ", " & i + 11 & ", " & i + 12 & ", " & i + 13 & ", " & i + 14 &
", " &
i + 15 & ", " & i + 16 & ", " & i + 17 & ", " & i + 18 & ", " & i + 19 &
")")
        Call .Execute
    End With
Next i
interroto dopo 60' e 457.000 record inseriti
------------------------------------------------
