Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

velocizzare query

  1. #1
    Rochy Joe non è in linea Scolaretto
    Salve sottopongo alcuni quesiti e una verifica del codice usato.
    da quando ho iniziato ad usare il db con diversi front-end e il backend su server mi sono accorto di notevoli riduzioni di prestazioni in alcune operazioni che quando il backend era sul mio C: (in fase progettazione) non avvenivano..
    Mi sono allora posto il quesito se ci fossero nel codice vba da me inserito dei modi per risparmiare tempo...
    Un esempio è quello che espongo:
    devo duplicare dei record, ovvero dei campioni i cui dati sono inseriti in 3 tabelle (TbElencoCampioni, TbMatrProva, TbSTP)... La prima contiene caratteristiche del campione, la seconda associa campione a parametri, la terza associa parametri a sottoparametri
    Per fare questo ho usato inserire in tutte e tre le tb un campo si/no [AppenaInserito] e che sfrutto per varie operazioni..
    Private Sub cmdDuplicaRecords_Click()
    Dim DBS                                 As DAO.Database
    Dim rst                                 As DAO.Recordset
    Dim rst1                                As DAO.Recordset
    Dim rst2                                As DAO.Recordset
    Dim rst3                                As DAO.Recordset
    Dim rst4                                As DAO.Recordset
    
    Dim strSQL                              As String
    Dim NewIDCamp, NewIDMatr, NewIDMatr2, _
        NewIDStp, I, regNumber, OldID       As Long
    Dim stracc, strnum, risp                As Variant
    
    On Error GoTo Err_cmdDuplicaRecords_Click
    
    DoCmd.Hourglass (True)
    Me.Painting = False
    OldID = Me.IDcampione ' mi tengo in memoria il vecchio numero di accettazione se decido di non duplicare o altro
    
    If Me.Opz_NContinuo = True And Me.Opz_NonContinuo = False Then  ' caso in cui devi duplicare 1 solo record o più record con n. consecutivi
        
        'Verifichiamo se la txt contiene un numero
        If Len(Me.txtQtaDaInserire & "") = 0 Then
            regNumber = 1
        Else
        	regNumber = Me.txtQtaDaInserire
        End If
        stracc = Me.NewAccettazione ' valorizzo la variabile stracc per elaborare il numero di accettazione
    
        Set DBS = DBEngine(0)(0)
    
        Set rst4 = DBS.OpenRecordset("TbElencoCampioni", dbOpenDynaset)
        If Me.IDcampione <> "" Then
            If Me.NewAccettazione <> "" Then
                risp = MsgBox("Confermi la duplicazione del record " & Me.numero_accettazione & "? ", vbYesNo, "Attenzione")
                If risp = vbYes Then
                
    	    'A questo punto iniziamo un ciclo For da 1 a quanto indicato nella txtQtadainserire (se vuota è default pari a 1)
                For I = 1 To regNumber
                    'ometto ......
    		'elaborazione numero accettazione
                    stracc = stracc & strnum
                  With rst4
        		
                    'inserisco un nuovo record nella tabella TbElencoCampioni
                    'prendendo i valori dal record selezionato
                    strSQL = "INSERT INTO TbElencoCampioni (numero_accettazione, Descrizione, IDMatrice," _
                             & "OpzAP, AP, Opzs_camp, s_campionata, l_trasporto, Opz_vol, volume, Opz_MR, MR," _
                             & "IDUtente, dtainserimento, AppenaInserito) " _
                             & "SELECT '" & stracc & "', TbElencoCampioni.Descrizione,TbElencoCampioni.IDMatrice," _
                             & "TbElencoCampioni.OpzAP, TbElencoCampioni.AP, TbElencoCampioni.Opzs_camp, TbElencoCampioni.s_campionata," _
                             & "TbElencoCampioni.l_trasporto, TbElencoCampioni.Opz_vol, TbElencoCampioni.volume, TbElencoCampioni.Opz_MR," _
                             & "TbElencoCampioni.MR, '" & Me.txtLogin & "', Now(), 1 FROM TbElencoCampioni " _
                             & "WHERE TbElencoCampioni.IdCampione=" & Me.IDcampione & " "
                    'eseguo l'istruzione di inserimento
                    DBEngine(0)(0).Execute (strSQL)
    
                    'Per sapere il nuovo IDCampione generato
                    strSQL = "SELECT IDCampione from TbElencoCampioni WHERE AppenaInserito=-1"
                    
                    Set rst = DBS.OpenRecordset(strSQL)
        
                    If Not rst.EOF Then
                        NewIDCamp = rst.Fields("IDcampione").Value
                        
                    End If
                    rst.Close
                                    
                    'Aggiorno i campi AppenaInserito per non confondermi con futuri inserimenti
                    strSQL = "Update TbElencoCampioni SET AppenaInserito=0 WHERE IdCampione=" & NewIDCamp
                    'eseguo l'istruzione di aggiornamento
                    DBEngine(0)(0).Execute (strSQL)
                    
                    'A questo punto ho in nuovo ID e il vecchio
                    'posso procedere con la prima tabella collegata TbMatrProva
                    strSQL = "INSERT INTO TbMatrProva (IDcampione, IDPar, IDUtente, datainserimento, AppenaInserito) " _
                             & "SELECT " & NewIDCamp & ",TbMatrProva.IDPar, '" & Me.txtLogin & "', Now(), 1 " _
                             & "FROM TbMatrProva WHERE TbMatrProva.IDCampione=" & Me.IDcampione & " "
                    'eseguo l'istruzione di inserimento
                    DBEngine(0)(0).Execute (strSQL)
                    
                    'Mi ricavo il nuovo ID della tabella MatrProva con lo stesso metodo
                    strSQL = "SELECT IDMatrProva FROM TbMatrProva WHERE AppenaInserito=-1 ORDER BY IDMatrProva"
                    
                    Set rst1 = DBS.OpenRecordset(strSQL)
                    If Not rst1.EOF Then
                        NewIDMatr = rst1.Fields("IDMatrprova").Value
                        
                    End If
                    'rst1.Close non lo chiudo ma lo mantengo aperto perchè mi serve dopo
                    
                                    
                    'A questo punto in effetti la duplicazione dobbiamo fare una piccola variazione sul tema
                    'dobbiamo duplicare tutti i record della tabella TbMatrProva per quel IDCampione ovvero
                    'serve un ciclo while
                    
                    'In Rst2 apro i TbMatrProva originali
                    strSQL = "SELECT IDMatrProva FROM TbMatrprova WHERE IDCampione=" & Me.IDcampione
                    Set rst2 = DBS.OpenRecordset(strSQL)
                    
                    'in Rs1 (mantenuto aperto) apro i nuovi TbMatrProva ovvero quelli duplicati
                    'strSQL = "SELECT IdMatrProva FROM TbMatrProva WHERE AppenaInserito=-1 ORDER BY IDMatrProva"
                    'Set rst1 = DBS.OpenRecordset(strSQL)
                    'a partire da questo punto e fino all'istruzione LOOP compirò le operazioni descritte
                    '(DO) While not od Until ..fino alla fine del recordset (rst.EOF significa End Of File, fine del recordset)
    
                    Do While Not rst2.EOF
                        NewIDMatr2 = rst1.Fields("IDMatrprova").Value
                        strSQL = "INSERT INTO TbSTP (IDMatrprova, IDMetSTP, Terreno, Strum, MRC, IDUtente, datainserimento, diluizione, AppenaInserito) " _
                                & "SELECT " & NewIDMatr2 & ",TbSTP.IDMetSTP, TbSTP.Terreno, TbSTP.Strum, TbSTP.MRC, '" & Me.txtLogin & "', Now()," _
                                & "TbSTP.diluizione, 1 FROM TbSTP " _
                                & "WHERE IdMatrProva=" & rst2!IDMatrProva & " "
                        'eseguo l'istruzione di inserimento
                        DBEngine(0)(0).Execute (strSQL)
                        
                        'Ricavo l'id nuovo inserito nella TbSTP con lo stesso metodo aggiornando il campo AppenaInserito
                        strSQL = "SELECT ID FROM TbSTP WHERE AppenaInserito=-1"
                        Set rst3 = DBS.OpenRecordset(strSQL)
                        If Not rst3.EOF Then
                            NewIDStp = rst3.Fields("ID").Value
                        End If
                        rst3.Close
                        
                        'Azzero appenainserito nella TbSTP per non confondermi
                        DBEngine(0)(0).Execute "UPDATE TbStp SET TbSTP.AppenaInserito=0"
                                               
                        'mi sposto sui record successivi
                        rst2.MoveNext
                        rst1.MoveNext
                    Loop
                    rst1.Close
                    rst2.Close             
                                    
                    'Aggiorno i campi AppenaInserito per non confondermi con futuri inserimenti rimasti sulla tabella TbMatrProva
                    DBEngine(0)(0).Execute "Update TbMatrProva SET TbMatrProva.AppenaInserito=0"
                     
                End With
    
                   Next I
                    'rst.Close
                    'rst1.Close
                    'rst2.Close
                    'rst3.Close
                    rst4.Close
                    DBS.Close
                    Set rst4 = Nothing
                    Set rst3 = Nothing
                    Set rst2 = Nothing
                    Set rst1 = Nothing
                    Set rst = Nothing
                    
                    Me.Requery
                    Me.Recordset.FindFirst "IDCampione = " & NewIDCamp
                    
                    Me.NewAccettazione = ""
                    Me.txtQtaDaInserire = ""
                    MsgBox ("Duplicazione terminata!")
                    DoCmd.Hourglass (False)
                    Me.Painting = True
         	 	Exit Sub
                End If
    	'.................ometto
    
    il tutto funziona ed è veloce se devo fare poche repliche, ma se sono di più e il campione ha molti parametri e ognuno di questi molti sottoparametri il tutto si rallenta (ovviamente) da quando il backend è su server. Mi chiedo allora (magari dovuto il più alla velocità di connessione) c'è un modo più veloce per access di scrivere es...
    i recordset una volta aperti e settati per quel ciclo ed ottenuto il valore che mi interessa, è meglio chiuderli e poi al ciclo successivo riaprirli o posso lasciarli aperti e risettarli ad ogni ciclo e chiuderli alla fine (risparmio molti passaggi di codice).
    Se invece li chiudo potrei dimensionarne meno ed usare lo stesso rst per più cose (risparmio dimensionamento ma devo sempre aprirli e chiuderli)
    Le strSQL è meglio preparale strSQL=() e poi eseguirle DBEngine(0)(0).Execute (strSQL) o eseguirle direttamente, c'è differenza in tempo di esecuzione per Access?
    Secondo voi c'è qualche errore concettuale?
    Ci sono per caso altre funzioni che access sfrutta per inserire, aggiornare, più veloci del .Execute (qsta è una domanda da mia mente contorta ma non si sa mai)

    grazie e scusate la lungaggine
    Ultima modifica di Rochy Joe; 04-03-2015 10:31 

  2. #2
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    ...
    Dim NewIDCamp, NewIDMatr, NewIDMatr2, _
        NewIDStp, I, regNumber, OldID       As Long
    ...
    
    Quello che sto per dirti avrà un impatto incredibile sulle prestazioni (nel senso che non ci crederai che non cambia quasi niente) ma la dichiarazione fatta così non va bene se intendevi dichiarare tutte le variabili come Long. Infatti solo l'ultima, OldID, perché immediatamente seguita da "As Long" è veramente Long, le altre sono tutte Variant.
    Il modo giusto è
    Dim NewIDCamp As Long, NewIdMatr As Long, NewIDStp As Long ...
    
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    Dim stracc, strnum, risp                As Variant
    
    qui sono tutte Variant non perché alla fine hai scritto As Variant ma solo perché per le prime due variabili non hai indicato il tipo quindi in automatico attribuisce il tipo Variant
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    il tutto funziona ed è veloce se devo fare poche repliche, ma se sono di più e il campione ha molti parametri e ognuno di questi molti sottoparametri il tutto si rallenta (ovviamente) da quando il backend è su server. Mi chiedo allora (magari dovuto il più alla velocità di connessione) c'è un modo più veloce per access di scrivere es...
    i recordset una volta aperti e settati per quel ciclo ed ottenuto il valore che mi interessa, è meglio chiuderli e poi al ciclo successivo riaprirli o posso lasciarli aperti e risettarli ad ogni ciclo e chiuderli alla fine (risparmio molti passaggi di codice).
    Se invece li chiudo potrei dimensionarne meno ed usare lo stesso rst per più cose (risparmio dimensionamento ma devo sempre aprirli e chiuderli)
    Le strSQL è meglio preparale strSQL=() e poi eseguirle DBEngine(0)(0).Execute (strSQL) o eseguirle direttamente, c'è differenza in tempo di esecuzione per Access?
    Secondo voi c'è qualche errore concettuale?
    Ci sono per caso altre funzioni che access sfrutta per inserire, aggiornare, più veloci del .Execute (qsta è una domanda da mia mente contorta ma non si sa mai)
    Il fatto che il BackEnd sia raggiungibile tramite LAN e non più su disco locale è indubbio che abbia ridotto le prestazioni.
    Per tutto il resto non so risponderti. Ci sono però un paio di utenti qui (li sto invocando con il pensiero) che se ne intendono parecchio. Un consiglio che va sempre bene è l'utilizzo più che accorto degli indici.
    Se il tutto te lo permette (quindi provare in ambiente e/o copie di test) potresti provare con le Transaction How to: Use Transactions in a DAO Recordset
    Poi qui Microsoft Access Performance FAQ ci sono altri consigli generali (datati ma... meglio conoscerli).

  3. #3
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Certo che c'è un "errore concettuale", anzi sono più di uno.
    Il primo è operare mediante cicli, l'utilizzo di finte-chiavi, il secondo di avere query "intermedie" per attingere i dati, infine operare con un sistema-JET che è basato su file e non su un "vero" server SQL

    L'utilizzo degli indici può essere utile per operazioni tipo questa
    Update TbMatrProva SET TbMatrProva.AppenaInserito=0
    che però, detto tra di noi, semplicemente non funziona in un ambiente concorrente

    In sostanza quindi, a mio sindacabilissimo parere...
    - non puoi aspettarti prestazioni elevate con JET e cicli, tanto meno in rete
    - comunque non peggiorarli con approcci "strani" per generare le chiavi
    - che soprattutto non funzionano in ambiente concorrente...
    - come pre-requisito ovviamente è avere indici, con elevata selettività ancor più ovviamente, sui campi che specifichi
    in uguaglianze (where qualcosa=qualcos'altro). Superfluo rammentare che però indici del genere li "paghi" negli inserimenti
    e nelle modifiche. dovrai stabilire quale sia il costo minore (tra select e le insert)


    Suggerisco quindi di ripensare un po'... tutto...
    Ultima modifica di +m+; 05-03-2015 12:30 

  4. #4
    Rochy Joe non è in linea Scolaretto
    ok, scusate il ritardo nella risposta ma è proprio vero che quando si pensa di aver finito è il momento di riniziare.....

    mi ci è voluto del tempo per ripensare a come raffinare il codice....e rivederlo sulla base delle risposte.... lavorando sempre in sistema-Jet (almeno per ora....poi penserò a mettermi a studiare vero server SQL)

    Andando ad eliminare il campo AppenaInserito e aumentando la selettività in uguaglianze, sono passato, in rete, da un tempo medio di duplicazione per 10 record di 20-25 secondi a 6-7secondi.

    Private Sub cmdDuplicaRecords_Click()
    Dim dbs                                 As DAO.Database
    Dim rstTbCampioni                       As DAO.Recordset
    Dim rstTbMatrProva                      As DAO.Recordset
    Dim rstTbSTP                            As DAO.Recordset
    Dim OldID, regNumber, risp              As Integer
    Dim stracc, strNum, strSQL              As String
    Dim I, NewIDCamp, NewIDMatr             As Integer
    
    On Error GoTo Err_cmdDuplicaRecords_Click
    
    DoCmd.Hourglass (True)
    Me.Painting = False
    ' mi tengo in memoria il vecchio numero di accettazione se decido di non duplicare o altro
    OldID = Me.IDcampione
    ' caso in cui devi duplicare 1 solo record o più record con n. consecutivi
    If Me.Opz_NContinuo = True And Me.Opz_NonContinuo = False Then
        'Verifichiamo se la txt contiene un numero..se vuota imposto di defoult 1
        If Len(Me.txtQtaDaInserire & "") = 0 Then
            regNumber = 1
        Else
        regNumber = Me.txtQtaDaInserire
        End If
        stracc = Me.NewAccettazione
    
        If Me.IDcampione <> "" Then
            If Me.NewAccettazione <> "" Then
                risp = MsgBox("Confermi la duplicazione del record " & Me.numero_accettazione & "? ", vbYesNo, "Attenzione")
                If risp = vbYes Then
                Set dbs = DBEngine(0)(0)
                Set rstTbCampioni = Me.Recordset.Clone
    
                    'A questo punto iniziamo un ciclo For da 1 a quanto indicato nella txtQtadainserire (se vuota è defoult pari a 1)
                    For I = 1 To regNumber
                        '.................. ometto elaborazione numero accettazione
                       stracc = stracc & strNum
                       'inserisco un nuovo record nella tbElencoCampioni copiando i valori da record corrente
                      With rstTbCampioni
                            .AddNew
                            !numero_accettazione = stracc
                            !Descrizione = Me.Descrizione
                            !IDMatrice = Me.IDMatrice 
                            !OpzAP = Me.OpzAP
                            !AP = Me.AP
                            !Opzs_camp = Me.Opzs_camp
                            !s_campionata = Me.s_campionata
                            !l_trasporto = Me.l_trasporto
                            !Opz_vol = Me.Opz_vol
                            !volume = Me.volume
                            !Opz_MR = Me.Opz_MR
                            !MR = Me.MR
                            !IDUtente = Me.txtLogin
                            !dtainserimento = Now()
                            NewIDCamp = !IDcampione
                            .Update
                            
                       End With
            
                        'A questo punto ho in nuovo ID e il vecchio
                        'posso procedere con la prima tabella collegata TbMatrProva (uso un INSERT) per copiare tutti gli IDMatrProva
                        strSQL = "INSERT INTO TbMatrProva (IDcampione, IDPar, IDUtente, datainserimento) " _
                                 & "SELECT " & NewIDCamp & ",TbMatrProva.IDPar, '" & Me.txtLogin & "', Now() " _
                                 & "FROM TbMatrProva WHERE TbMatrProva.IDCampione=" & Me.IDcampione
                        'eseguo l'istruzione di inserimento
                        dbs.Execute (strSQL)
                        
                       'apro un recordset in sola lettura della TbMatrProva filtrato sul nuovo campione
                        strSQL = "SELECT IDMatrProva FROM TbMatrProva WHERE IDCampione = " & NewIDCamp & " ORDER BY IDMatrProva"
                        Set rstTbMatrProva = dbs.OpenRecordset(strSQL, dbReadOnly)
                                                               
                        'In RstTbSTP apro in sola lettura la TbMatrProva con i valori originali del record corrente      
                        strSQL = "SELECT IDMatrProva FROM TbMatrprova WHERE IDCampione=" & Me.IDcampione
                        Set rstTbSTP = dbs.OpenRecordset(strSQL, dbReadOnly)
                        
                        'A questo punto in effetti la duplicazione dobbiamo fare una piccola variazione sul
                        'tema. Devo duplicare tutti i record della tabella TbSTP per quel IDMatrProva e IDMetSTP (legato
                        'all'IDPar). In modo che mi permettano di duplicare tutti i record della tabella STP.
                        'A partire da questo punto e fino all'istruzione LOOP compirò le operazioni descritte
                        '(DO) While not od Until ..fino alla fine del recordset (rst.EOF significa End Of File, fine del recordset).
                        'Poi mi sposto all'interno dei recorset in sola lettura di cui il primo mi serve per l'inserimento il secondo
                        'per  la copia (USO INSERT)
                        Do While Not rstTbSTP.EOF
                            NewIDMatr = rstTbMatrProva.Fields("IDMatrprova").Value
                            strSQL = "INSERT INTO TbSTP (IDMatrprova, IDMetSTP, Terreno, Strum, MRC, IDUtente, datainserimento, diluizione) " _
                                    & "SELECT " & NewIDMatr & ",TbSTP.IDMetSTP, TbSTP.Terreno, TbSTP.Strum, TbSTP.MRC, '" & Me.txtLogin & "', Now()," _
                                    & "TbSTP.diluizione FROM TbSTP " _
                                    & "WHERE IdMatrProva=" & rstTbSTP!IDMatrProva & " "
                            'eseguo l'istruzione di inserimento
                            dbs.Execute (strSQL)
                                                         
                            'mi sposto sui record successivi
                            rstTbSTP.MoveNext
                            rstTbMatrProva.MoveNext
                        Loop
                        
                    Next I      ' eventualmente passa alla duplicazione successiva
    
                        Set rstTbCampioni = Nothing
                        Set rstTbMatrProva = Nothing
                        Set rstTbSTP = Nothing
                        Set dbs = Nothing
                        Me.Requery
                        Me.Recordset.FindFirst "IDCampione = " & NewIDCamp
                        Me.Painting = True
                        Me.NewAccettazione = ""
                        Me.txtQtaDaInserire = ""
                        MsgBox ("Duplicazione terminata!")
                        DoCmd.Hourglass (False)
                        Exit Sub
                    End If
    
    Così che ne dite? Ho migliorato l'utilizzo degli indici?
    Ultima modifica di Rochy Joe; 09-03-2015 15:10 

  5. #5
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    ok, scusate il ritardo nella risposta ma è proprio vero che quando si pensa di aver finito è il momento di riniziare.....

    mi ci è voluto del tempo per ripensare a come raffinare il codice....e rivederlo sulla base delle risposte.... lavorando sempre in sistema-Jet (almeno per ora....poi penserò a mettermi a studiare vero server SQL)

    Andando ad eliminare il campo AppenaInserito e aumentando la selettività in uguaglianze, sono passato da un tempo medio di duplicazione per 10 record di 20-25 secondi a 6-7secondi.

    Private Sub cmdDuplicaRecords_Click()
    Dim OldID, regNumber, risp              As Integer
    Dim stracc, strNum, strSQL              As String
    Dim I, NewIDCamp, NewIDMatr             As Integer
    ...
    
    Ripeto quanto indicato nel primo intervento: quello che sto per dirti avrà un impatto incredibile sulle prestazioni (nel senso che non ci crederai che non cambia quasi niente) ma la dichiarazione fatta così non va bene. Infatti solo l'ultima, è rispettivamente di tipo Integer, String e Integer, le altre sono tutte Variant.
    Il modo giusto è
    Dim OldID As Integer, regNumber As Integer, risp As Integer
    Dim stracc As String, strNum As String, strSQL As String
    Dim I as Integer, NewIDCamp As Integer, NewIDMatr As Integer
    
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    Così che ne dite? Ho migliorato l'utilizzo degli indici?
    Non lo sappiamo, da qui, visto che quelli sono solo nelle tabelle (ma se anche li vedessi sinceramente non saprei come aiutarti, lo dico solo per chi eventualmente ha le conoscenze per farlo)

  6. #6
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    Così che ne dite? Ho migliorato l'utilizzo degli indici?
    Bho...

    Profila.
    Finquando non profili, qualsiasi cosa dici è inutile.
    Ottimizzare qualcosa, senza misurare e senza la consapevolezza di cosa succede, spesso porta a situazioni opposte.

    Dopo che hai profilato puoi individuare quali siano le porzioni che richiedono più interesse.
    ---
    Sulla performances generale la risposta è... boh.
    Dipende da quanto son grandi questi record.
    Certo che per duplicare una manciata di dati normalmente il tempo lo misuro in millisecondi, ma non uso access se non per esportare i dati SQL server, quindi non posso aiutarti sotto questo profilo

  7. #7
    Rochy Joe non è in linea Scolaretto
    grazie per le risposte.

    per

    - Phil_cattivocarattere: sì scusa chiedo venia..
    - +m+: ok, vedo di capire cosa tu intenda per "profila" visto che per mia somma ignoranza non ho conoscenza di tale procedura

  8. #8
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    per

    - Phil_cattivocarattere: sì scusa chiedo venia..
    Ti perdono.
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    - +m+: ok, vedo di capire cosa tu intenda per "profila" visto che per mia somma ignoranza non ho conoscenza di tale procedura
    (siamo in due sommi ignoranti allora)
    Nella somma ignoranza di cui sopra, visto che ci stai mettendo mano, prova ad usare i recordset anziché le query di aggiornamento-accodamento. Non ho alcun fondamento per questo suggerimento, però, così... ad intuito... mi sembra più immediato l'inserimento tramite recordset rispetto alla costruzione di una stringa da eseguire ogni volta. Purtroppo non ho alcuna situazione simile sulla quale fare prove per verificare sul campo in prima persona le diverse prestazioni. Ripeto: considerala una strada da provare ma non prenderla per oro colato.

  9. #9
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    - +m+: ok, vedo di capire cosa tu intenda per "profila" visto che per mia somma ignoranza non ho conoscenza di tale procedura
    Profiling=misurazione delle prestazioni.
    Perchè è lento il tuo programma?
    E' lento nelle selezioni?
    Negli inserimenti?
    Nei cicli?

    Divide-et-impera sulle varie porzioni.
    Togli gli inserimenti (mettili fake) e vedi se è lì il problema.
    Togli i cicli
    Etc. etc.

    Smonta e rimonta misurando i tempi di esecuzione, così da intervenire, se possibile, nelle aree di criticità

  10. #10
    Quote Originariamente inviato da Rochy Joe Visualizza il messaggio
    grazie per le risposte.
    Non collegato all'uso dei recordset, qui ci sono parecchi suggerimenti per migliorare le prestazioni e qua e là si fa riferimento agli indici Performance Tips To Speed Up Your Access 2007 Database

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Velocizzare Query MySql
    Da Danielus nel forum MySQL
    Risposte: 14
    Ultimo Post: 03-06-2020, 13:10
  2. Velocizzare collegamento al Nas
    Da mandrak nel forum Networking e sicurezza
    Risposte: 1
    Ultimo Post: 12-11-2019, 09:39
  3. Velocizzare una query
    Da Giammi77 nel forum Microsoft Access
    Risposte: 14
    Ultimo Post: 02-05-2016, 12:58
  4. Risposte: 12
    Ultimo Post: 18-12-2012, 20:42
  5. Velocizzare query
    Da Ale Monza nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 10-10-2010, 12:35