Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    429

    [VBA] Access: query molto lenta con campi indicizzati

    Ciao a tutti,
    in una maschera di access ho questo codice:
    codice:
    Private Sub nota_avanzo_Change()
        Call ModificaNotaAvanzo
    End Sub
    
    
    Private Sub ModificaNotaAvanzo()
        Dim SQL As String
        Dim RS As DAO.Recordset
        Dim DB As DAO.Database
        
        Set DB = CurrentDb
        SQL = "SELECT nota_avanzo FROM pratiche WHERE pratica=" & Me.nPratica  ' - 1
    	SQL = "SELECT nota_avanzo FROM pratiche WHERE idpratica=" & Me.idPR    ' - 2
        Set RS = DB.OpenRecordset(SQL)
        RS.Edit
        
        RS!nota_avanzo = Me.nota_avanzo.Text
        RS.Update
        RS.Close
        Set RS = Nothing
        DB.Close
        Set DB = Nothing
    End Sub



    Nota_avanzo su database e' un campo memo, nella maschera si tratta di una textbox che quando viene modificata salva il suo contenuto su DB.
    Nella tabella pratiche ho due campi uno che si chiama pratica e uno idpratica.
    Il campo idpratica e' numerico intero lungo autoincrementante e indicizzato con duplicati non ammessi e chiave primari, il campo pratica e' numerico precisione doppia indicizzato duplicati non ammessi.
    Se uso SQL 1 per modificare il dato impiega 0,02 - 0,05 secondi, se uso SQL 2 ogni carattere che premo ci vogliono dai 4 ai 7 secondi per avere nuovamente il controllo della maschera e poter digitare un altro carattere.
    Mi e' successo anche di avere bisogno di una query che si basa sul campo idpratica e risultava molto lenta.
    Volevo capire il motivo di una differenza cosi elevata, nella tabella ci sono 176762 record, mi sapete aiutare?
    Da un grande potere derivano grandi responsabilità

  2. #2

  3. #3
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    429
    idPr e' una textbox nella maschera, idpratica nella tabella e' indicizzato con duplicati non ammessi ed e' anche chiave primaria
    Da un grande potere derivano grandi responsabilità

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,459
    Che senso ha fare il salvataggio ogni volta che si modifica il testo nella casella?

    E ancora, perché non fare direttamente una UPDATE invece di aprire una query con SELECT che sia editabile, aggiornare il campo e salvarlo, facendo quindi una pletora di passaggi poco performanti e operazioni inutili?

    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    cavolo, non l'avevo visto! ogni carattere digitato cerca e salva? wow!

  6. #6
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    429
    si avete ragione, ma ho fatto cosi in modo che chi lo usa se si dimentica di salvare la nota non la perda, vedo se riesco a fare in altro modo.

    ho provato come suggerisci tu alka ma i tempi non cambiano, ci sono sempre differenze molto elevate se uso nella clausola WHERE idpratica oppure pratica, non capisco il motivo dato che sono entrambi campi indicizzati e numerici

    avete altre idee?
    Da un grande potere derivano grandi responsabilità

  7. #7
    richiedo: la colonna pratiche.idPR è indicizzata?

  8. #8
    Quote Originariamente inviata da abellos Visualizza il messaggio
    idpratica oppure pratica ... sono entrambi campi indicizzati e numerici
    ok, non avevo visto.

    puoi postare il codice attuale?

  9. #9
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    429
    ciao,
    il codice che uso ora e'
    codice:
    Private Sub ModificaNotaAvanzo()
        Dim SQL As String
        Dim StartTime As Double
        Dim Tempo1 As Double
        Dim Tempo2 As Double
        
        StartTime = Timer
    
    
        SQL = "UPDATE pratiche SET nota_avanzo='" & FixApici(Me.nota_avanzo.Text) & "' WHERE pratica=" & Me.nPratica
        CurrentDb.Execute SQL
        CurrentDb.Close
        
        Tempo1 = Round(Timer - StartTime, 2)
        
        tempi.Caption = "T1: " & Tempo1 & " s"
                            
    End Sub
    la funzione fixApici raddoppia solamente gli apici ' in modo da non avere problemi se si inseriscono apostrofi
    Ultima modifica di abellos; 04-02-2022 a 18:26 Motivo: spiegazione fixApici
    Da un grande potere derivano grandi responsabilità

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Quote Originariamente inviata da optime Visualizza il messaggio
    richiedo: la colonna pratiche.idPR è indicizzata?

    aveva già risposto di si, vedi messaggi precedenti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.