Dabase multiutente in rete, ottimizzazione/query lato serv

di il
18 risposte

Dabase multiutente in rete, ottimizzazione/query lato serv

Buonasera a tutti,
vi chiedo una mano per intraprendere la strada giusta per i successivi sviluppi del mio applicativo.
Per la gestione di una piccola società, Ho costruito un database, già diviso in BE FE, nato per essere monoutente.
Nel tempo le necessità sono cambiate, allora il BE è stato messo su un "SERVER" e ogni utente ( generalmente 3, massimo 5) vi accede con il FE installato.
Fin qui tutto bene...tranne le prestazioni che sono crollate drasticamente.
Ho applicato diversi consigli e FAQ trovati nei vari forum, notando dei miglioramenti, ma vorrei spingermi oltre, migliorando ancora le prestazioni.
Considerate che il progetto (ci sono circa 35 tabelle,50 maschere e 40 report) si basa principalmente su 3 tabelle:
tblappuntamenti ( 17 campi e fino a 20.000 record)
tbloperatori (56 campi e un centinaio di record)
tblClienti (64 campi e circa 700 record)
ho pensato a 2 approcci ( eventualmente additivi) x ridurre il più possibile la quantità di dati che transita nella rete:
1) ridurre il numero di campi delle tabelle, eventualmente dividendo le più grosse in 2 o 3 tabelle con rapporto 1 a 1. e questo lo so fare ma vi chiedo se otterrei miglioramenti di prestazioni
2) ( e qui vi chiedo il maggiore aiuto perchè non saprei come fare) ho sentito parlare ( se no sbaglio da Alex Baraldi ) di far eseguire le query lato server..

Mi sapete dare una mano?
grazie mille a tutti in anticipo

18 Risposte

  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    cicciu75 ha scritto:


    Buonasera a tutti,
    vi chiedo una mano per intraprendere la strada giusta per i successivi sviluppi del mio applicativo.
    Per la gestione di una piccola società, Ho costruito un database, già diviso in BE FE, nato per essere monoutente.
    Nel tempo le necessità sono cambiate, allora il BE è stato messo su un "SERVER" e ogni utente ( generalmente 3, massimo 5) vi accede con il FE installato.
    Fin qui tutto bene...tranne le prestazioni che sono crollate drasticamente.
    Ho applicato diversi consigli e FAQ trovati nei vari forum, notando dei miglioramenti, ma vorrei spingermi oltre, migliorando ancora le prestazioni.
    Magari facci un riassunto di questi accorgimenti, giusto per non esporre cose che già hai preso in considerazione...

    cicciu75 ha scritto:


    Considerate che il progetto (ci sono circa 35 tabelle,50 maschere e 40 report) si basa principalmente su 3 tabelle:
    tblappuntamenti ( 17 campi e fino a 20.000 record)
    tbloperatori (56 campi e un centinaio di record)
    tblClienti (64 campi e circa 700 record)
    ho pensato a 2 approcci ( eventualmente additivi) x ridurre il più possibile la quantità di dati che transita nella rete:
    1) ridurre il numero di campi delle tabelle, eventualmente dividendo le più grosse in 2 o 3 tabelle con rapporto 1 a 1. e questo lo so fare ma vi chiedo se otterrei miglioramenti di prestazioni
    2) ( e qui vi chiedo il maggiore aiuto perchè non saprei come fare) ho sentito parlare ( se no sbaglio da Alex Baraldi ) di far eseguire le query lato server..

    Mi sapete dare una mano?
    grazie mille a tutti in anticipo
    Quello che hai esposto al punto 1 ora non serve a NULLA.
    Quello che hai esposto al punto 2 serve solo se come Database non hai JET... perchè questi concetti non sono applicabili.
    Quindi potresti iniziare a valutare l'uso di SQL_SERVER_Express come Database, ma non è così semplice... far lavorare bene il Server soprattutto per chi è abituato ad usare Access e non costruisce le Query in modo adeguato.

    Ti faccio un esempio
    
    SELECT * FROM T1 WHERE Fld1=Forms!NomeForm!NomeCampo
    Questa Query ad esempio non verrà mai eseguita ServerSide... da SQLSERVER... quindi ai fini prestazionali sarà come avere sempre JET...

    SQL_SERVER o altri RDBMS offrono strumenti di valutazione delle query, quindi dovrai decisamente dotarti di capacità di osservazione e studio degli strumenti.

    Certo, per la mia esperienza, un DB come JET è molto strano che con 3 accessi concorrenti generi un CROLLO prestazionale così rilevante... io fino a 5 Utenti, se ben costruito, non ho mai avuto grossi problemi...
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Pienamente d'accordo con @Alex al 100%.

    Soprattutto il fatto che il problema del crollo non è causato dai 3/5 utenti della rete.
    Io ho programmi usati anche da 10/15 utenti senza colpo ferire.

    Tutto però dipende moltissimo dal COME si sviluppa un programma FE ed è chiaro che se nasce per multi-utenza, è necessario analizzare/rivedere le parti di codice che accedono ai dati, come si aprono e chiudono i recordset, come si fanno le SELECT, e via discorrendo.
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Prima di tutto volevo ringraziarvi per avermi risposto.
    Ok, quindi abbandonata l'ipotesi 2 ( query lato server).
    Si, ho valutato il passaggio a MSsql express ma almeno per ora volevo evitarlo perchè, a parte questo problema tutto funziona molto bene ( e anche velocemente se BE e FE sono nello stesso pc) e soprattutto perchè sono convinto ( penso come voi ) che più che un problema di limiti di access sia un problema di limite MIO con access, che vorrei superare.
    alcuni accorgimenti li ho presi da qui ( http://www.fmsinc.com/tpapers/faster ) come ad esempio:
    - tenere una connessione sempre aperta
    - ridurre il numero di campi nelle tabelle ( ma Alex, se mi dici che non serve, evito perchè mi complica le cose)
    - trasferire nel FE le tabelle che contengono dati statici
    - effettuare gli inserimenti tramite form appositi che poi, tramite vba, fanno delle insert nelle tabelle.
    Eventualmente, dei suggerimenti del link postato ( o altri non menzionati), quali mi consigliate?
    ad esempio di questa sezione http://www.fmsinc.com/tpapers/faster/#Multiuse Performance Tips
    no saprei minimamente come approcciare il punto 3 e 4 ma non so neanche se e quanto siano cose utili!
    ...insomma..riconosco che c'è il problema ma non saprei da dove iniziare!
    1) può essere un problema della rete?
    tutti i pc con in FE sono collegati in rete tramite un netgear GS105 5PT COP GETH SWTCH.
    c'è qualche impostazione da cambiare nei pc per rendere la rete più performante?
    2) può essere un problema di costruzione del database?
    si tratta di un mdb replica master ( perchè poi ogni pc ha una replica slave che sincronizza prima di andare a casa)
    3) può essere un problema di costruzione di query o delle maschere?
    ...insomma, volevo approfittare della vostra esperienza per sapere a cosa dare priorità.
    è la mia prima esperienza in un progetto multiutente ...
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    cicciu75 ha scritto:


    Prima di tutto volevo ringraziarvi per avermi risposto.
    Ok, quindi abbandonata l'ipotesi 2 ( query lato server).
    Si, ho valutato il passaggio a MSsql express ma almeno per ora volevo evitarlo perchè, a parte questo problema tutto funziona molto bene ( e anche velocemente se BE e FE sono nello stesso pc) e soprattutto perchè sono convinto ( penso come voi ) che più che un problema di limiti di access sia un problema di limite MIO con access, che vorrei superare.
    Probabile... l'esperienza in questi casi è decisamente quello che potrebbe fare la differenza.

    cicciu75 ha scritto:


    alcuni accorgimenti li ho presi da qui ( http://www.fmsinc.com/tpapers/faster ) come ad esempio:
    - tenere una connessione sempre aperta
    - ridurre il numero di campi nelle tabelle ( ma Alex, se mi dici che non serve, evito perchè mi complica le cose)
    - trasferire nel FE le tabelle che contengono dati statici
    - effettuare gli inserimenti tramite form appositi che poi, tramite vba, fanno delle insert nelle tabelle.
    Eventualmente, dei suggerimenti del link postato ( o altri non menzionati), quali mi consigliate?
    ad esempio di questa sezione http://www.fmsinc.com/tpapers/faster/#Multiuse Performance Tips
    no saprei minimamente come approcciare il punto 3 e 4 ma non so neanche se e quanto siano cose utili!
    ...insomma..riconosco che c'è il problema ma non saprei da dove iniziare!
    Tenere aperta una connessione direi che è evidente in quanto si evita di doverla ristabilire... per questo di solito si crea una Tabella Vuota lato BE e si apre un RS immediatamente su AutoExec del FE che si sfrutta sia per testare la raggiungibilità del BE che proprio per mantenere nel POOL delle connessioni la strada avviata...
    Prova a vedere questo TEST:

    Ridurre il numero dei campi... è assurdo solo da pensare, di norima si fa ingegneria del Database e si mettono i campi che servono... è normale che se ne hai di INUTILI, per manutenzione li eliminerai...

    L'inserimento a mezzo di INSERT è ben da ragionare... in linea di massima SI perchè impegna meno, e di solito è bene tener distinta la VISUALIZZAZIONE dall'inserimento... tutti discorsi però che con JET vacillano.

    Personalmente inizierei a badare a cose molto più terra terra...
    Evitare il proliferare di COMBO e LISTBOX sulle maschere, ottimizzare le Tabelle con l'uso di ChiaviPrimarie ed INDICI, possibilmente Numerici(Risultano più veloci).
    Creare Query Ottimizzate, JET fornisce lo SHOWPLAN per capire se una query è scritta bene e ti consente di valutarne in parte i piani di esecuzione...
    Sono da EVITARE come la peste le query nelle quali si mettono 10 CRITERI con la valutazione del NULL per comprendere dutti i RECORDS... perchè questo aumenta i tempi di esecuzione...
    Sono da evitare l'uso delle Funzioni di Aggregamento sui Domini sia nel codice VBA che nelle Query, parliamo di DCOUNT/DLOOKUP ecc...
    Sono da evitare Combo con migliaia di Items... chi mai si mette a scorrere più di qualche decina di Items di selezione...?
    Sono da impostare bene le Relazioni
    Sono da evitare Forme gerarchiche Form-SubForm-SubForm-SubForm a più di 2 livelli...

    Ci sono tantissime cose da tener presente, e non esiste un BUGIARDINO che le elenca tutte...

    cicciu75 ha scritto:


    1) può essere un problema della rete?
    tutti i pc con in FE sono collegati in rete tramite un netgear GS105 5PT COP GETH SWTCH.
    c'è qualche impostazione da cambiare nei pc per rendere la rete più performante?
    2) può essere un problema di costruzione del database?
    si tratta di un mdb replica master ( perchè poi ogni pc ha una replica slave che sincronizza prima di andare a casa)
    3) può essere un problema di costruzione di query o delle maschere?
    ...insomma, volevo approfittare della vostra esperienza per sapere a cosa dare priorità.
    è la mia prima esperienza in un progetto multiutente ...
    La MultiUtenza con la VELOCITA' in realtà ha solo qualche baffo in comune... gli aspetti critici sono gli accessi concorrenti allo stesso Record, o in caso di NUOVO se devi generare PK progressive Formali...
    Credo siano proprio 2 temi estremamente differenti.
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    cicciu75 ha scritto:


    .....
    2) ( e qui vi chiedo il maggiore aiuto perchè non saprei come fare) ho sentito parlare ( se no sbaglio da Alex Baraldi ) ....
    Io non uso mai il mio Cognome quando scrivo... quindi cortesemente ti chiedo di evitare questa cosa.
    Grazie.
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Alex scusami, ho letto così tante volte il tuo nome e cognome che l'ho scritto in automatico
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    In aggiunta a quanto detto da Alex, voglio mettere in evidenza due cose:

    1) una delle maggiori cause di lentezza è spesso dovuta ad una scorretta (se non mancante) creazione degli indici.
    In linea di massima pensa che quando imposti una condizione di filtro (WHERE) i campi che devi filtrare devono essere indicizzati, altrimenti la query sarà lenta in modo proporzionale al numero di record presenti in tabella, man mano che aumentano, la query rallenterà sempre di più.

    Se ti esegui una query:
    SELECT campo1 FROM Tabella
    WHERE CampoData > data
    CampoData deve essere indicizzato.


    2) NON usare mai SELECT * FROM tabella,
    ma sempre SELECT <elenco_campi_che_servono> FROM tabella
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Ok,mi avete dato abbastanza lavoro
    Inizierò con il verificare gli indici delle tabelle, le query,etc..e userò l'analizzatore di access ( non l'avevo ma visto ed utilizzato )
    mi applico e vi tengo aggiornati.
    grazie ancora
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Grazie dell'argomento!
    ritengo molto interessante e costruttivo!

    una domanda.
    parlate di

    2) NON usare mai SELECT * FROM tabella,
    ma sempre SELECT <elenco_campi_che_servono> FROM tabella

    mi e' capitato piu' volte per tabelle o tabelle in relazione con altre di creare delle query, ma al momento di esecuzione mi compare TROPPI CAMPI

    - c'e' anche la possibilità di utilizzare viste SQL collegate poi ad access
    le ritengo utili per creare in sql server delle "query" tra tabelle collegate.
    Vedo ce e' possibile utilizzarle anche per inserire in dati.
    cosa ne pensate?
    Grazie
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Le famose Query PassTrought... hai provato a verificarle...?
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Grazie del messaggio

    proprio riguardo le query Pass-through
    molte volte per parametrizzare le procedure mi tornerebbe utile creare queste query che poi il risultato dovrebbe essere materia prima per una query (di raggruppamento )
    e' possibile fare questo con le Pass-through?

    Grazie
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    pfmarro ha scritto:


    grazie del messaggio

    proprio riguardo le query Pass-through
    molte volte per parametrizzare le procedure mi tornerebbe utile creare queste query che poi il risultato dovrebbe essere materia prima per una query (di raggruppamento )
    e' possibile fare questo con le Pass-through?

    Grazie
    Credo sia il caso di approfondire le Query PT...



    https://accessexperts.com/blog/2011/07/29/sql-server-stored-procedure-guide-for-microsoft-access-part-1/
    Ecc...

    Puoi eseguire delle SP lato Server ed ottenere dei Dati o eseguirai comandi, oppure far eseguire una Query sempre lato server, chiaramente la Query deve essere interpretabile dal Server...!
    Una Query a campi incrociati ad esempio non verrà interpretata dal Server SQL...
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Rieccomi.
    Allora, premetto che ora le cose vanno decisamente meglio:
    1) ho migliorato le Query eliminando quando possibile * con i campi realmente necessari
    2) ho semplificato le maschere più complesse, soprattutto quelle di uso più comune, eliminando combobox e subform.
    3) abbiamo cambiato il "server"..era un vecchissimo portatile addirittura con lan 100mbit/s.
    ..e ora tutto funziona decisamente meglio...ma.....la fame vien mangiando

    Non mi dispiacerebbe a questo punto passare a ms sql ( e quindi usare la QPT):
    la prima idea è quella di mettere il db online su qualche sito di hosting.
    Esistono siti di hosting ms sql gratuiti dove io metto db e tramite stringa di connessione ogni pc si collega contemporaneamente usando il Fe access?
    questa è una idea ma consigliatemi se è la strada giusta o se meglio agire diversamente.
    Grazie!!!
  • Re: Dabase multiutente in rete, ottimizzazione/query lato serv

    Cosa pensi di farci con un servizio di hosting. .?
    Non pensare di farci girare sqlserver e di raggiungerlo con Access... non stai parlando di una LAN ... ed a meno di avere un IP FISSO direi che non va bene senza usare sistemi complementari.
Devi accedere o registrarti per scrivere nel forum
18 risposte