Query di accodamento lentezza di eseguzione

di
Anonimizzato12131
il
10 risposte

Query di accodamento lentezza di eseguzione

Salve, devo convertire delle tabelle da un vecchio db ad uno nuovo. Creo la selezione dei campi che mi servono e aggiungo un campo che mi assegna un numero progressivo ad ogni cliente degli ordini fatti.
Ho preparato la query di selezione che mi mostra i risultati corretti velocemente anche su una tabella di quasi 400.000 record. Quando la trasformo in query di accodamento l'esecuzione diventa lentissima causa campo progressivo che deve accodare (premessa senza questo campo la query viene eseguita in tempi brevi, pochi minuti).
Questo è il campo incriminato ed il codice eseguito:
ProgressivoOrdini: DCount("*";"TabOrdini";"cliente='" & [cliente] & "' And id<=" & CLng([id]))

Sto eseguendo la query in forma ridotta di circa 10.000 record per volta frammentando i clienti, ma anche così ci mette circa un'ora ad preparare l'accodamento dei 10.000 record.
Conoscete soluzioni che possano velocizzare i tempi di eseguzione degli accodamenti, perchè la soluzione di far girare la query in più passaggi mi crea problemi su tabelle di grosse dimensioni che devo ancora lavorare per altri clienti.
Access 2007

10 Risposte

  • Re: Query di accodamento lentezza di eseguzione

    Tu hai un campo progressivo che non è progressivo di sua natura, ma è frutto di quella espressione relativamente complessa. Per questo motivo ti rallenta tutto. Molto più semplicemente accoda i tuoi campi senza tale campo, mentre il tuo nuovo campo chiave primaria contatore lo crei a parte e si autoincrementerà da solo. Ti faccio notare che accodare 400.000 record...Access non ce la fa e invia un messaggio di errore. In base a delle impostazioni predefinite, non saprei dirti un numero preciso, ricordo che Access può accodare al massimo 45.000 record alla volta.
  • Re: Query di accodamento lentezza di eseguzione

    Lo so che il conteggio è complesso, ma non è un semplice campo contatore, conta gli ordini del cliente numero 1, poi salta al cliente 2 e riparte a conteggiare gli ordini da 1per il cliente 2 e così via.
    Quindi mi è necessaria essendo un valore richiesto dal nuovo db.
  • Re: Query di accodamento lentezza di eseguzione

    Attento a non confondere le tabelle con le query. Nelle tabelle non devono essere memorizzati valori di calcolo, ma solo quelli più primordiali. Sulla base di essi costruisci una nuova query con le stesse caratteristiche di calcolo. A questo punto 400.000 record cominciano a insospettirmi che tu non abbia normalizzato le tue tabelle...ma per rispondere a questo occorre una descrizione dettagliata di tutti i campi e di tutte le tue tabelle.
  • Re: Query di accodamento lentezza di eseguzione

    L'unico calcolo in fase di accodamento è quello descritto, tutto il resto l'ho preparato creando una tabella di appoggio con i dati, devo solo valorizzare il campo del progressivo, non esistono altre espressioni. Come ti ho già detto se creo query di accodamento senza il campo che sto cercando di valorizzare, mi accoda 400000 record senza problemi, in tempi rapidi.
    Quel tipo di formula l'ho trovata cercando di costruire un progressivo per ogni degli ordini per ogni cliente e ha funzionato egregiamente su db piccolo nell'ordine di 5000 record.
    Ho avuto il problema con grossi db.
    Non so se sei in grado di consigliarmi un altro modo per costruire il progressivo che mi serve, anche in VB. Sto cercando soluzioni alternative.
    Quello ce devo creare è il prog_ordine_cliente:
    id_Cliente id_Ordine Prog_ordine_cliente
    1 1 1
    1 2 2
    1 3 3
    2 4 1
    2 5 2
    3 6 1

    Spero che l'esempio sia chiaro.
    Grazie in anticipo
  • Re: Query di accodamento lentezza di eseguzione

    Dal mio punto di vista sei su una strada sbagliata. Quei dati devono essere frutto di adeguate relazioni fra più tabelle.
    Domande:
    1. Hai più tabelle?
    2. Se sì, come si chiamano e quali campi hanno?
    3. Quali sono le loro relazioni?

    Il tuo database deve passare attraverso queste domande, altrimenti si ingolfa, rallenta, funziona male e non puoi applicare funzioni e codici adeguati.
  • Re: Query di accodamento lentezza di eseguzione

    Le relazioni le ho fatte prima devo solo valorizzare il campo per poi esportare il tracciato nel nuovo db, la cosa assurda che la query di selezione che mi mostra i risultati e rapida e corretta.
  • Re: Query di accodamento lentezza di eseguzione

    Perdonami, ho provato a rileggere tutto il thread, ma non ho capito, mi sfugge qualcosa oppure tu non sei stato chiaro.
    Potresti elencarmi tutti i campi di tutte le tabelle del VECCHIO database?
    Potresti elencarmi tutti i campi di tutte le tabelle del NUOVO database?
    Puoi indicare esattamente come deve avvenire l'accodamento?
    L'espressione che hai creato non mi convince...ossia non so a cosa serve...ripeto...non ci ho capito molto.
  • Re: Query di accodamento lentezza di eseguzione

    Ti ringrazio per l'attenzione, senza elencarti tutti i dati del vecchio db, cerco di spiegarmi cosa porto nel nuovo: dal vecchio estraggo i dati con una query di selezione e crea tabella di appoggio per il nuovo db. (non ci sono problemi).
    Le vecchie tabelle non contengono il valore progressivo per ogni ordine del cliente, ma un id (contatore) dei record tabella_ordini.
    Io devo fare in modo che il nuovo campo progressivo (es:cliente 1; 3 ordini)numeri in progressione i 3 ordinativi che sono stati fatti, poi passa al cliente 2 e numera in progressione gli ordini fatti dal cliente 2, così via.
    Se il db fosse vuoto creerei un contatore con DMAX, ma dovendo inserire dati esistenti devo numerare i vecchi ordinativi. La funzione che ho scritto svolge il lavoro in selezione egregiamente, visualizzando i risultati richiesti. Quando si tratta di accodare o creare una nuova tabella o anche aggiornare il campo, risulta pesante e rallenta tutto il processo fino a bloccare Access.
    Sono alla ricerca di una espressione che sia simile e che sia più leggera.
    Spero di essere stato chiaro, se hai bisogno ti scrive sql query.
  • Re: Query di accodamento lentezza di eseguzione

    algatto ha scritto:


    Le vecchie tabelle non contengono il valore progressivo per ogni ordine del cliente, ma un id (contatore) dei record tabella_ordini.
    Tu hai bisogno di un "contatore relativo". Prova a digitare queste parole chiave nel forum. Purtroppo non esiste nulla di automatico al riguardo e chi ci è riuscito ha dovuto implementare delicati e pericolosi codici per ottenerli. Quando dico "delicati e pericolosi" intendo dire che la tabella sottostante deve essere sempre ordinata in un certo modo altrimenti tale numerazione automatica relativa salta compromettendo tutto il lavoro precedente. Di più non so.
  • Re: Query di accodamento lentezza di eseguzione

    Magari non si applica al tuo caso specifico, non lo so dato non hai indicato come la generi, ma mi chiedevo:
    non è possibile generare il progressivo direttamente nella procedura che crea la tabella di appoggio?

    Sempre ammesso che tu abbia creato una procedura (codice VB), perché se usi una query allora il mio pensiero non vale.

    In ogni caso, il tuo campo:
    ProgressivoOrdini: DCount("*";"TabOrdini";"cliente='" & [cliente] & "' And id<=" & CLng([id]))
    non mi è chiaro, dato che nei campi che hai indicato non appare alcun campo di nome 'cliente' e 'id'

    Magari se mostri la query...
Devi accedere o registrarti per scrivere nel forum
10 risposte