Problemi query ed errori

di il
13 risposte

Problemi query ed errori

Ciao,

da circa un anno è attiva un'applicazione che però sta manifestando alcuni problemi (in modo sempre più frequente).
E' distribuita in 2 file (uno applicativo e l'altro tabelle) dove fra le altre vi sono 11 tabelle collegate via ODBC a sqlserver e 2 tabelle collegate ad altro Access

Problemi attivi:
- Crescita dimensioni DB senza possibilità di ridurlo con Compatta e ripristina
- Query lente (25 sec invece di 15)
- Errore randomico in apertura maschera
- Errore stampa documenti con articoli inseriti recentemente (non importati) "Errore 2191: Impossibile impostare le proprietà Origine record in anteprima di stampa o dopo l'avvio della stampa"

Workaround
- attivata copia Access "applicazione" con dimensione corrette su corrispondente in prod

Test effettuati (considerate che ho una copia dell'applicazione che utilizzo io come sviluppo di seguito chiamata "svil"):
- creato nuovo Access "dati" ed esportate le tabelle -> fallito
- installato sul pc Access run time 2013 -> fallito
- copia di Access "applicazione" svil verso corrispondente prod -> fallito
- copia di Access "dati" prod verso corrispondente svil -> riuscito (stampa report e tempi query ridotti)
- incrocio Access "applicazione" svil che punta ad Access "dati" di prod

Non riesco a capire se esiste una correlazione fra i problemi descritti, ma soprattutto non ho ipotesi per la loro soluzione.
Se qualcuno riuscisse ad indirizzarmi verso un'analisi/soluzione ....

grazie

13 Risposte

  • Re: Problemi query ed errori

    tinto ha scritto:


    - Crescita dimensioni DB senza possibilità di ridurlo con Compatta e ripristina
    Per caso hai incluso immagini (BMP) dentro il database?
  • Re: Problemi query ed errori

    No, nessun oggetto viene salvato nel db.
    I PDF vengono salvati in una cartella e referenziati in una tabella del db.

    sergio
  • Re: Problemi query ed errori

    Probabilmente questi due sono correlati:

    - Crescita dimensioni DB senza possibilità di ridurlo con Compatta e ripristina
    - Query lente (25 sec invece di 15)

    1) un DB cresce perche ci sono sempre piu' record in una o piu' tabelle.
    Record che non sono cancellati.
    E' ovvio che un'operazione di tipo compatta fa solo la banale operazione di rigenerare il contenuto di una tabella rimuovendo i record cancellati (con la DELETE).
    Il perche' non vengano effettivamente cancellati (con ripristino dello spazio) e' un'altra questione (e pure complicata).

    2) se in una tabella con un saaaacco di record fai delle query che non utilizzano in modo intelligenti gli indici, il risultato e' che la soluzione della query richiede un full scan, cioe' la scansione, uno per uno, di tutti i record della tabella. Ma puo' anche essere peggio se la query conivolge 2 o piu' tabelle. In questa caso il numero di test potrebbe essere il prodotto del numero di record presenti in ogni tabella. Il che vuol dire che con 2 tabelle da 1000 record, rischi di fare 1.000.000 di test!

    E' evidente che non basta aggiungere un indice ad una tabella per far si le query, miracolosamente, diventino piu' veloci.
    Serve un'analisi delle query, ed in particolare del query plan, per capire in che ordine e quali colonne della tabella vengono coinvolte. A fronte di questa analisi, si devono identificare quali indici creare. O, come cambiare la clausola WHERE per far si che vengano utilizzati gli indici presenti in modo intelligente.

    Ed anche qui' la questione e' complicata: non si possono creare troppi indici, ma nemmeno troppo pochi.
    Quanti?

    Non per nulla i DBA vengono pagati un botto
  • Re: Problemi query ed errori

    Concordo con [Migliorabile] in linea di principio... se non che parliamo di LINKED TABLE... quindi i dati sono residenti all'esterno e non nell'applicativo che di norma si chiama FE(Client).
    Da quanto ho compreso in questo caso è il CLIENT che ESPLODE, pertanto non dovrebbe dipendere dalla mole di dati.
    E' mia abitudine usare MDE, e rimuovere e ripristinare ogni volta le connessioni alle Tabelle(se non altro per proteggere i dati, sappiamo bene che le Linked Table salvate nel CLIENT non sono da lasciare...!!!!).
    Se non si usa un Client Compilato in PCode ci si porta dietro tutta la parte che è soggetta a Debug... e questo implicitamente salva dati...

    Detto ciò le problematiche a mio avviso sono veramente più complesse, ed oltre alle corrette considerazioni... esposte da [Migliorabile], chi sviluppa con Access 9 volte su 10 trascura che le Query definite Client Side, quindi nel FE, nonostante estraggano i dati da un server SQL, se vengono scritte male(anche se gli indici sono ottimizzati) vanificano tutta la potenza di elaborazione del DBEngine di SQL_SERVER... in quanto rendono non risolvibile la query SERVERSIDE...

    Faccio un esempio che so benissimo essere il più tipico degli errori che uno sviluppatore non esperto commette
    
    SELECT * FROM T1 WHERE Id=Forms!nomeForm!NomeControllo
    Se si analizza con QueryOptimizer... si capisce che il motore non sa cosa sia [Forms!nomeForm!NomeControllo] in quanto è impossibile per SQL_Server effettuare una Risoluzione di questo testo che non sa nemmeno cosa sia..., in questo modo viene omessa la WHERE Condition, imponendo al Server la restituzione dell'intero Recordset, delegando poi JET a livello LOCALE all'elaborazione della WHERE Condition con la risoluzione esplicita del riferimento.
    Risultato...? Si ha una Ferrari e la si fa andare come una 500.

    Altra considerazione importante che si deve osservare è il mantenere Aperto il POOL delle connessioni con una Connessione al Server Fittizia, questo evita che ad ogni richiesta prima di tutto debba essere ripristinata la Connessione nel POOL, quindi l'esecuzione della Richiesta.
    Di norma si apre un Rs su una tabella fittizia e lo si tiene aperto...
    Questo velocizza l'esecuzione di molto...
  • Re: Problemi query ed errori

    Grazie ad entrambi per le risposte.
    Scusate l'imprecisione, ha intuito correttamente Alex, cresce l'access che contiene form, report, codice.... non quello che contiene le tabelle.

    Le tabelle, oltre a quelle linkate già citate, sono 19; la più grande ha 5000 record la seconda 3000 il resto 1000 o meno.

    Ho provato a salvare in formato accde, mi restituisce questo errore:

    Questo errore è in genere correlato alla compilazione di un database di grandi dimensioni in un file MDE.nbsp; A causa del metodo utilizzato per la compilazione del database, per ogni tabella viene creato un numero considerevole di riferimenti TableID.  Il modulo di gestione di database di Access supporta la creazione contemporanea di un massimo di 2048 riferimenti TableID aperti. L'esportazione di un database come file MDE può comportare potenzialmente il superamento di questo limite se il database include numerosi oggetti (tabelle, macro, maschere, report e così via).

    Contiene 34 maschere, 4 report, 1 modulo, 16 query, non capisco per quale motivo fallisca.

    Per quanto riguarda le query uso

    Set rst = db.OpenRecordset("SELECT ARCDCLI FROM Articoli WHERE ARNMDIS = '" & xNmDis & "';", dbOpenSnapshot)

    sia

    xTotSpec = DCount("LSNMDIS", "LegamiAS", "LSNMDIS='" & xNmDis & "'")

    Che mi sembrano compatibili con il concetto di bind variable (corregetemi se sbaglio.
  • Re: Problemi query ed errori

    Questa è la query origine dati della maschera principale che risulta essere particolarmnete lenta:
    SELECT DISTINCT Commesse.*, Articoli.ARNMDIS, Articoli.ARPIACON, ART_ICOL.ARDESSUP, Allegati.ALDESCR, Articoli.ARNOTE, Articoli.ARNOTE2, Articoli.ARSARCI2 FROM Allegati RIGHT JOIN ((Commesse LEFT JOIN Articoli ON Commesse.CMNMDIS = Articoli.ARNMDIS) LEFT JOIN ART_ICOL ON Articoli.ARCDGEST = ART_ICOL.ARCODART) ON Allegati.ALCDALL = Articoli.ARALLEG;
    Articoli è una tabella collegata da sqlserver: è ottimizzabile?
  • Re: Problemi query ed errori

    Mi pare che la Query abbia riferimenti a più Tabelle... tu citi solo [Articoli]... e le altre dove sono...?
    Mi auguro siano tutte su SQL_SERVER... altrimenti lo sai che succede...?

    Ovviamente diamo anche per scontato che i Campi di JOIN siano Indici ben strutturati.
  • Re: Problemi query ed errori

    15 secondi per una query?

    Dovrebbe essere, AL MASSIMO 1.5 s!!!!

    Qualunque query sopra i 2 secondi (con MILIONI di record) deve essere vistra con mooooolto sospetto, perche' e' segno che qualcosa non va!
  • Re: Problemi query ed errori

    Scusa Alex, ho toppato, sono tutte tabelle presenti nell'access di BE tranne Art_icol

    Commesse.CMNMDIS ne chiave ne indice
    Articoli.ARNMDIS chiave primaria
    Articoli.ARCDGEST ne chiave ne indice
    ART_ICOL.ARCODART chiave primaria su Sqlserver

    Immagino debba creare qualche indice ......
    Tieni conto però che:

    Commesse # 629
    Articoli # 1139
    ART_ICOL # 7381
  • Re: Problemi query ed errori

    Mi pare ci sia molta confusione in tutto...
    Lo scenario è tale per cui prima sistemi le cose evidenti, poi rivedi le considerazioni.
    Certo che fare delle JOIN su Tabelle in posti diversi è decisamente anomalo...
  • Re: Problemi query ed errori

    Ok,
    ho creato gli indici mancanti:

    Commesse.CMNMDIS
    Articoli.ARCDGEST

    I tempi di apertura della maschera non sono cambiati.
    La maschera contiene 3 sottomaschere, tutte si riferiscono a tabelle presenti nel Db di BE

    Origine record 1 sottomaschera:
    Certificati

    Origine record 2 sottomaschera:
    SELECT CollaudiSublotti.* FROM CollaudiSublotti;

    Origine record 3 sottomaschera:
    SELECT Collaudi.*, SpecificheA.* FROM Collaudi INNER JOIN SpecificheA ON (Collaudi.CDPOS = SpecificheA.SAPOS) AND (Collaudi.CDARTSPEC=SpecificheA.[SANMDIS]);

    La chiave primaria di SpecificheA è composta da SANMDIS ed SAPOS.
  • Re: Problemi query ed errori

    Ciao,

    ho individuato una query inefficente:
    
    DoCmd.RunSQL "UPDATE Collaudi INNER JOIN SpecificheA ON (Collaudi.CDARTSPEC = SpecificheA.[SANMDIS]) AND (Collaudi.CDPOS = SpecificheA.SAPOS) SET Collaudi.CDQTAPV = CercaPzprel(CercaLivello([SALIVEL],'" & xMas & "'),SALQA,'" & xMas & "'), Collaudi.CDNANR = CercaNaNr(CercaLivello([SALIVEL],'" & xMas & "'),SALQA,'" & xMas & "') WHERE (((CercaLivello([SALIVEL],'" & xMas & "'))<>'-') And ((Collaudi.CDNMCOM)='" & yComm & "') And ((Collaudi.CDSUBLOT)=" & ySubLot & ") And ((Collaudi.CDARTSPEC)='" & yArtSpec & "'));"
    ottimizzata questa (trasformata in una routine) i tempi sono tornati ad essere accettabili.

    Rimane invece il problema di stampa di report con articoli inseriti recentemente (non importati) "Errore 2191: Impossibile impostare le proprietà Origine record in anteprima di stampa o dopo l'avvio della stampa"

    Ho controllato attentamente il db edi i record relativi agli articoli che provocano l'errore sembrano corretti e completi (i campi sono valorizzati come gli atri record della tabella).

    Avete idee in merito?

    grazie
  • Re: Problemi query ed errori

    tinto ha scritto:


    Questa è la query origine dati della maschera principale che risulta essere particolarmnete lenta:
    SELECT DISTINCT Commesse.*, Articoli.ARNMDIS, Articoli.ARPIACON, ART_ICOL.ARDESSUP, Allegati.ALDESCR, Articoli.ARNOTE, Articoli.ARNOTE2, Articoli.ARSARCI2 FROM Allegati RIGHT JOIN ((Commesse LEFT JOIN Articoli ON Commesse.CMNMDIS = Articoli.ARNMDIS) LEFT JOIN ART_ICOL ON Articoli.ARCDGEST = ART_ICOL.ARCODART) ON Allegati.ALCDALL = Articoli.ARALLEG;
    Articoli è una tabella collegata da sqlserver: è ottimizzabile?
    Premetto che a naso, non so da che cosa possano dipendere i problemi, se non sicuramente da una concatenazione di eventi che alla fine creano tutti i rallentamenti, quello che proprio non mi piace è il SELECT DISTINCT. Ma la tabella commesse, non ha un indice univoco con il quale ricavare le commesse? Da quello che leggo, se non ho interpretato male, il motore è costretto ogni volta a fare e controllare tutti i record della tabella uno per uno, comprese tutte le sottodipendenze.

    Comunque potresti anche provare ad abbassare i limiti di timeout, di accesso al server, agli aggiornamenti, gli aggiornamenti dell'odbc, agli intervalli di aggiornamento, modificare l'accesso di blocco dei record etc etc.

    Comunque, non dimentichiamoci che access non è fatto per gestire una grossa mole di lavoro.
Devi accedere o registrarti per scrivere nel forum
13 risposte