Newsgroup: it.comp.appl.access
Titolo: [Lunghetto]: Access e le tabelle linkate ODBC

Mi servirebbero delle informazioni su come lavora Jet/Access in
relazione alle tabelle collegate.
Abbiamo un po' di progettini (abbast. elementari) che si basano su
file access con semplici (+ o -) query o maschere che prendono i dati
su tabelle Sql Server collegate.
Non sono query PassThrought, ma normali query di access che accedeno
alle tabelle.
Le tabelle in parte sono tabelle locali del mdb, ed in parte tabelle
ODBC collegate (per la maggior parte dei casi, tabelle Sql server).
Per il momento funziona tutto e con prestazioni dignitose, nonostante
non ci sia nessuna (o quasi) ottimizzazione (come ho detto sono
progettini non troppo sofisticati), perchè il server sql è in rete
locale a 100 Mbit.
Purtroppo tale server dovrà essere spostato in altra sede e da allora
la connessione sarà via internet con circa 1 Mbit di banda
utilizzabile (in realtà 2, ma io vorrei limitare il traffico sql a 1
Mbit).
Quindi all'orizzonte si propone una riduzione di banda di circa 100 a
1, con anche un notevole incremento dei tempi di latenza.
Ecco io vorrei sapere in quale caso le query operano in modalità
client-server ed in quale no. In modo da modificare ove possibile i
progetti per ottimizzare le prestazioni e ridurre sensibilmente il
traffico generato.
Mi spiego meglio proponendo delle casistiche di cui vorrei dei
dettagli:
1) Select pippo from tabella1 where id=3
tabella1 è una tabella odbc collegata su sql server.
Bene quando la query viene eseguita access che fa?
Passa la query a sql server che esegue lui la WHERE e poi ritorna solo
il recordset già filtrato a access?
O Access richiede lui tutti i record (magari pure con tutti i campi e
non solo con pippo) della tabella tabella1 e poi esegue la where e la
selezione campo tramite JET in locale?
Io a logica mi aspetterei la prima possibilità (che è esattamente come
farlo con una query passthrought), pero' lo chiedo a voi.
2) Select pippo, Format([data]; "yyyymmdd") from tabella1 where id=3
L'aggiunta di codice vb alla query cosa genera?
a) Fa tutto access tramite JET e quindi SQL server deve ogni volta
passargli l'intera tabella.
b) Sql server esegue lui la parte di filtro che puo' svolgere e poi
access esegue il codice vb solo sul recordset ritornato
3) Select con una join tra 2 o + tabelle. Tutte tabelle linkate odbc
che stanno tutte sullo stesso sql server.
Lavora Sql server o bruttissimo vengono trasferite via rete tutte le
tabelle e poi è JET ad operare la join.
4) Select con una join tra 2 tabelle dove una tabella è Sql server
linkata, ma l'altra è access locale
Qui per forza deve fare tutto JET, o c'è la speranza che il +
possibile venga delegato a sql server?
5) Maschera direttamente collegata ad una tabella linkata. 
Quando si apre la maschera, quanti record vengono caricati via rete?
6) Altri casi che ora non mi vengono in mente ma che invece sono da
tenere in considerazione.
Esplicitateli voi.
Nel caso access lavori sempre e comunque come NON-Client Server. Ossia
sia sempre JET ad elaborare le query delegando Sql server al ruolo di
misero fornitore di dati non prefiltrati. Quali potrebbero essere
stratagemmi
per migliorare la cosa?
Io ne ho in mente alcuni, ma vorrei consigli:
Caso del punto 1 e 3:
Si converte la query da query normale a query PassTrought
Caso del punto 2:
Si spacca la query in una sequenza di + query.. Una q. passthrought
che tira fuori (in una tabella temp di access)
i dati prefiltrati.
Ed una seconda query access che calcola le formule VBA sul recordset
della tabella temp
Caso del punto 4:
Si spacca anche qui la query in una sequenza di + query.
Prima si estraggono, in una tabella temp access, tutti i record da sql
server, limitando la cosa ai campi strettamente necessari (per ridurre
il traffico) ed applicando tutti i filtri (clausole where e co) che
possono essere fatti fare sql server.
Poi si fa la query con le join, che ora saranno solo su tabelle tutte
access.
Alla maggior parte delle domande si potrebbe rispondere con delle
prove, pero' dato che la maggior parte dei progettino non sono miei ma
roba realizzata dai miei colleghi, io dovrei cercare di realizzare un
mini documento guida che spieghi cosa non puo' essere fatto (pena
prestazioni pessime e linea internet costantemente intasata).
Spingendo i colleghi alla revisione dei loro progetti mdb già
esistenti e contemporaneamente evitando la nascita di nuove query che
se da una parte sono fatte in 5 minuti, dall'altra pero' non sono +
tollerabili con
la nuova tipologia di rete.
Grazie a chiunque mi risponderà
Fabrizio

Fabrizio Ramponi wrote:
[CUT]
Se devi lavorare con un server remoto ti consiglio di evitare le tabelle
collegate per le query.
Mi spiego meglio, se hai una query con una join con tabelle collegate la
join verrà eseguita in locale per cui verranno trasferite le tabelle e poi
verrà effettuata la join, questo perchè Access trasforma la query in una
serie di query compatibili con SQL Server.
L'ideale è quindi lavorare con Query pass-through, per le maschere idem ti
conviene aprirle in modalità solo inserimento così si evita un unitile
trasferimento di dati.
Antonio.