Velocizzare query: trasformare query selezione in pass-trough

di il
10 risposte

Velocizzare query: trasformare query selezione in pass-trough

Rieccoci,

come da titolo, ho bisogno del vostro aiuto nel velocizzare l'esecuzione di alcune query ...ho creato una struttura divisa in be e client...dove nel client collego anche una tabella (APPOSTAMENTO) da un 3 db posizionato sempre sulla stessa cartella di rete del back-end

ho letto in diversi post che con le query passtrough potrei far lavorare il server e sparare al client solo i risultati...Credo che sia una soluzione percorribile per il mio problema principale...(lentezza nell'esecuzione specificata in "elaborazione in corso" per minuti....)

quella che presumo mi rallenti è una query di selezione che screma APPOSTAMENTO e mi restituisce solo i campi necessari... del tipo 5 su 100

ora la mia idea era di creare questa query "ElencoNucleo" come pass torugh nel db (il 3) dove risiede la Tabella APPOSTAMENTO...

tutto bene finche non mi sono dovuto imbattere nei campo calcolati...e quindi presumo che il SQL di access non sia esattamente quello che la qry pass torugh digerisce...

vi posto il codice della query di selezione nella speranza che possiate aiutarmi a risolvere questa lentezza paurosa nell'esecuzione...
SELECT APPOSTAMENTO.[Matr meccanografica], APPOSTAMENTO.Grado, APPOSTAMENTO.Cognome, APPOSTAMENTO.Nome, APPOSTAMENTO.Sesso, APPOSTAMENTO.Ruolo, APPOSTAMENTO.Articolazione, APPOSTAMENTO.[Anzianità Grado], (IIf([Grado]="M.A." And (Year(Date())-Year([Anzianità Grado])>=8),1,0)+(IIf([Grado]="M.C." And (Year(Date())-Year([Anzianità Grado])>=10),1,0)))+(IIf([Grado]="BR.C." And (Year(Date())-Year([Anzianità Grado])>=8),1,0))+(IIf([Grado]="BR.C." And (Year(Date())-Year([Anzianità Grado])>=4),1,0))+(IIf([Grado]="APP.SC." And (Year(Date())-Year([Anzianità Grado])>=8),1,0))+(IIf([Grado]="APP.SC." And (Year(Date())-Year([Anzianità Grado])>=5),1,0)) AS CodAnz, CInt(DMin("IDGrado","TblGradiconAnzianita"," [TblGradiconAnzianita].[Grado] ='" & [APPOSTAMENTO].[Grado] & "'"))+[CodAnz] AS FkGrado, IIf([Ruolo]="Ispettori",1,0)+IIf([Ruolo]="Sovrintendenti",2,0)+IIf([Ruolo]="App e Fin",3,0) AS CodRuolo
FROM APPOSTAMENTO
WHERE (((APPOSTAMENTO.Ruolo)<>"Ufficiali") AND ((APPOSTAMENTO.Posizione)="Presente" Or (APPOSTAMENTO.Posizione)="Distaccato/altro"))
ORDER BY APPOSTAMENTO.Cognome, APPOSTAMENTO.Nome;
ovviamente se sto prendendo una strada sbagliata sono lieto di trovare e imparare soluzioni migliori...
grazie in anticipo
Ciccius

10 Risposte

  • Re: Velocizzare query: trasformare query selezione in pass-trough

    CicciusPrime ha scritto:


    ...ho letto in diversi post che con le query passtrough potrei far lavorare il server e sparare al client solo i risultati...
    Ma la query pass-through si usa con SQL Server come back-end. Hai quello? Dalla tua esposizione non è così evidente.

    CicciusPrime ha scritto:


    ...vi posto il codice della query di selezione nella speranza che possiate aiutarmi a risolvere questa lentezza paurosa nell'esecuzione...
    ovviamente se sto prendendo una strada sbagliata sono lieto di trovare e imparare soluzioni migliori...
    Quella query contiene parecchie delle caratteristiche che si suggerisce di evitare: la funzione su dominio DMin e tutti quei campi calcolcolati, sì, sono un pugno nello stomaco, specie con quegli IIf a raffica.
    Secondo me dovresti pensare ad un sistema diverso per calcolare CodAnz... ma visto così è complicato (almeno per me) dare suggerimenti "concreti".
    Dulcis in fundo = i campi sui quali si eseguono le where devono essere indicizzati per avere le prestazioni migliori.
    Potrebbe esserti d'aiuto l'attivazione dello "showplan". Cerca sul web per vedere cos'è e come funziona.
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Grazie Phil

    ora vedo di indicizzare quei campi...

    per il backend... non credo sia su sql server... non ne ho idea... da inesperto ho fatto solo "Dividi" e posizionato il client in un altra posizione...lasciando il back end nel percorso di rete lasciando fruibile da piu postazioni...

    potrebbe essere una soluzione lanciare da codice, all'avvio del db o su pulsante...., una creazione tabella che mi crei ElencoNucleo nel Client??? non si aggiorna tanto di frequente... ma almeno in questo modo potrei avere meno rallentamenti non dovendo caricare tutto il tabellone ogni volta...e' sensato???

    chiedo scusa per domande stupide....e ringrazio come sempre per il Prezioso contributo
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Non per scusarmi...

    ma sto prendendo a cuore una cosa che sembra un db e sto cercando di risanarlo secondo un criterio... quello relazionale... il punto di partenza è che per una serie svariata di motivi... si è creato un tabellone (APPOSTAMENTO ) che con Access non ha nulla a che vedere se non la visualizzazione maschera e qualche uno a molti...ovviamente non mi interessa criticare l'utilizzo fatto fin 'ora... ma piuttosto cercare di organizzare una struttura che mi possa consentire, pezzo per pezzo, di ricostruire il db e ralazionarlo come si conviene....

    chi ha utilizzato il tabellone fin'ora non ha conoscenze di access e quindi spesso usae modifica direttamente tabelle come un foglio di excel...... cosa che avrei fatto anchio qlc anno fa..

    da qui l'esigenza (MIA) di dover normalizzare Appostamento... e quindi creare una tabella gradi ecc.,ecc,ecc,...
    chiaramente... per quello che serve a chi lo usa... è sufficiente e quindi continuano ad usarlo... io per conto mio sto cercando di mostrargli i vantaggi di una struttura organizzata e relazionata.....ma è quasi un'impresa impossibile....

    portate pazienza se vi chiedero cose ovvie....
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    CicciusPrime ha scritto:


    per il backend... non credo sia su sql server... non ne ho idea... da inesperto ho fatto solo "Dividi" e posizionato il client in un altra posizione...lasciando il back end nel percorso di rete lasciando fruibile da piu postazioni...
    Ehm... se non lo sai tu cos'hai fatto... detto così è presumibile che tu abbia creato un file mdb o accdb che fa da back-end.
    In generale da tutto quello che scrivi (e non solo perché lo ammetti) si vedono parecchie lacune che mi portano ad alcune ulteriori domande: chi l'ha fatto quel database? Quanto "ne sai" di database? Quanto hai studiato come funziona un database, almeno come nozioni base intendendo per tali non come si crea una query, una maschera, un report o come si applicano i filtri ma... proprio come si "costruisce" un database.
    Questa non è un'interrogazione scolastica, nessuno dà i voti, ma serve a capire se i suggerimenti servono davvero a superare ostacoli particolari o se bisogna ripensare tutto alla radice.
    (vedo che nel frattempo hai scritto altro, non l'ho letto con super attenzione, considera questo posto come non influenzato dal tuo ultimo intervento)
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Lasciamo un secondo da parte il fine... ed analiziamo il mezzo... QUERY PASS-TROUGH.

    Sai di cosa si parla...? Temo tu ti sia fatto ingannare nel leggere qualche dettaglio senza averne visione di insieme, e ti ha colpito che sono più veloci.

    Le Q_PT si possono eseguire su qualsiasi Database REMOTO, tuttavia serve del BUONSENSO... e capire le particolarità che hanno e quando è opportuno usarle.
    Eseguire una Q_PT su Access(JET come BE) è inutile perchè non porterebbe nessun vantaggio rispetto che eseguire una Query Standard, ma ti imporrebbe ugualmente la ristrutturazione del predicato SQL.

    Quindi ha senso se le usi con un MOTORE che può fare la differenza ,e questo lo si ha se il BE è un DBServer come SqlServer o MySQL o altri equivalenti...!

    Temo però che tu per poter RISTRUTTURARE un DB, debba sicuramente partire dalla Normalizzazione dei DATI, ma la lentezza delle Query con Access è data percentualmente dall'inesperienza di chi le scrive... e la soluzione non sono le Q_PT ma scrivere Query ottimizzate.
    Per farlo serve sapere di cosa si parla come in tutti gli aspetti, quindi si devono individuare gli INDICI nei campi Oggetto di Ricerche o JOIN... si evitano funzioni di aggregazione sui Domini (DSUM/DMAX/DLOOKUP...) si evitano criteri WHERE multipli inutili... quelli che se non si fa selezione si mette *
    Si limita il numero dei campi a quello necessario e non si mette SELECT * ....
    Si evita la risoluzione IMPLICITA dei riferimenti ad Oggetti delle Maschere a vantaggio dei Parametri...
    Ecc....

    Insomma scrivere un predicato SQL non è banale, o meglio banalmente troppi nemmeno sanno scrivere fanno con l'autocomposizione e pensano sia quello il modo...!

    Prova a leggere bene, non solo dei pezzi, questi link:


    https://bytes.com/topic/access/answers/908665-how-optimize-slow-query
    https://support.office.com/en-us/article/use-the-performance-analyzer-to-optimize-an-access-database-c44619df-4248-421f-9b8b-30b86082d792
    http://www.eident.co.uk/2017/03/performance-microsoft-access-databases/

    Non proseguo perchè credo tu abbia parecchie cose da affrontare...
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Post prima di ALEX...

    Il back end creato è .accdb mentre il db vecchio dove risede appostamento è .mdb

    per quanto riguarda la mia preparazione mi sono avvicinato per passione ad access frequentando un corso avanzato del pacchetto office.. senza la programmazione vba... cosa che ho imparato prima in excel...qlc anno fa... e ora mi cimento con access...ho realizzato un crm per la ditta di famiglia Grafica) che gestisce ordini e fatture e magazzino...

    ho imparato sempre sgugolando a lavorare con i DAO e ho letto una guida che consiglio ai neofiti come me... "costruire applicazioni con access 2010 di mike davis"...

    mi piacerebbe imparare php e mysql... per ovviare ad access e utilizzare il web...solo che con 3 figli piccoli il tempo che resta per le passioni è veramente risicato...

    vi ho sempre letto in questi anni ed ho trovato sempre risposte o spunti interessanti...
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Grazie Alex,

    sono cosciente del fatto che sono solo agli inizi...

    come molti... parto dall'esigenza e cerco di risolvere... poi man mano aggiusto il tiro...grazie ai consigli di chi ne sa piu di me...
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    CicciusPrime ha scritto:


    Grazie Alex,
    sono cosciente del fatto che sono solo agli inizi...
    Questo capita a molti.

    CicciusPrime ha scritto:


    come molti... parto dall'esigenza e cerco di risolvere... poi man mano aggiusto il tiro...grazie ai consigli di chi ne sa piu di me...
    Questo capita a molti... ed è l'errore più grave...! Approccio da cantinaro lo chiamo.
    Prima si studia per avere elementi tecnici su cui poter far affidamento per le competenze, altrimenti le soluzioni arrivano come questa della Query PT e capisci che è sbagliato...?
    Senza studiare fai solo accrocchi non tecnici...

    Ti metto in evidenza anche questa cosa che hai detto:

    CicciusPrime ha scritto:


    mi piacerebbe imparare php e mysql... per ovviare ad access e utilizzare il web...solo che con 3 figli piccoli il tempo che resta per le passioni è veramente risicato...
    L'unica cosa sensata, giusti per farti capire, è quella che con 3 figli hai poco tempo, e sicuramente lo immagino
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    F18
  • Re: Velocizzare query: trasformare query selezione in pass-trough

    Alla fine ho risolto facendo una query di creazione tabella (Vista) che lancio da codice prima dell'apertura report, dove per ogni id (matr mecc) li associo il suo codtitolo(riferito al titolo più alto posseduto e sesso)...su questa tabella è una passeggiata lanciare l'interrogazione a campi incrociati...ora però... sono di nuovo a rompere le scatole per sapere se c'è un modo in questa query a campi incrociati di non visualizzare le "non corrispondenze"... ovvero...ho un titolo 1F che non ha corrispondenze nella tabella vista...e quindi in visualizzazione foglio dati... mi "stampa" un bel 0 in una riga senza intestazione riga(IDgrado)....
    allego foto

    c'è modo di visualizzare la colona 1f senza valori????
    Allegati:
    26204_239c902d0937761b2752f70d68c764fe.png
    26204_239c902d0937761b2752f70d68c764fe.png
Devi accedere o registrarti per scrivere nel forum
10 risposte