Newsgroup: it.comp.appl.access
Titolo: Prestazioni scadenti query che alimenta form

Sto avendo un bel problema con la lettura di un set di dati da 
visualizzare su una form continua
Nel senso che il tempo di restituzione dei dati e' dell'ordine di un 
minuto circa, quindi inaccettabile, deve rispondere max qualche secondo
 
La form e' una form continua e per ogni riga mostra una decina di campi, 
articoli, prezzi, esistenza
 
SELECT ARTICOLI.CODICE, ARTICOLI.DESCRIZIONE_BREVE, PREZZI.ID_PREZZI, 
PREZZI.PREZZO, PREZZI.PREZZO_IVATO, CONTABILEDEPOSITITESTATE.ESISTENZA, 
CONTABILEDEPOSITITESTATE.DISPONIBILITA, PREZZI.CODICE_DEPOSITO, 
PREZZI.CODICE_LISTINO, PREZZI.CODICE_VALUTA FROM (ARTICOLI LEFT JOIN 
PREZZI ON ARTICOLI.CODICE = PREZZI.CODICE_ARTICOLO) LEFT JOIN 
CONTABILEDEPOSITITESTATE ON ARTICOLI.CODICE = 
CONTABILEDEPOSITITESTATE.CODICE_ARTICOLO WHERE 
ARTICOLI.DESCRIZIONE_BREVE Like "Base*" and PREZZI.CODICE_DEPOSITO=1 and 
PREZZI.CODICE_LISTINO= 1
 
Windows 8.1 sul client, Windows 10 sul server db
Versione Access 2003 (ho provato anche con 2013) sul client
Db Firebird 3.0 sul server
Rete 1000 Mbit/sec
 
La stringa sopra viene usata all'interno dell'evento Form_Load della 
schermata con la seguente istruzione:
me.recordsource=stringa_sql (quella sopra)
 
Prove gia' fatte:
- 1 creata query su Access, lanciata, stessa lentezza
- 2 creata stessa query su IbExpert (db manager) e risponde 
istantaneamente, quindi il db server+pc+rete+struttura db penso si possa 
escludere
- 3 indicizzati tutti i campi coinvolti con le join e le selezioni
 
Quando lancio, dentro Access, la query sopra descritta, vedo un discreto 
traffico di rete (3-4 Mbit/sec che vangon sul client, 1-2 Mbit/sec che 
vanno) il che mi fa pensare che Access non converta la query per il db 
usato ma si ciucci le tabelle grezze e si smazzi i dati come vuole lui
 
La domanda e': come fare per evitare di far 'pensare' Access ed inviare 
la query direttamente al db server, leggendo i dati di risulta?
Oppure, piu' semplicemente, come fare per velocizzare le operazioni?

 Oppure, piu' semplicemente, come fare per velocizzare le operazioni?
 
 
 
Una query così semplice dovrebbe essere inviata al Server dal driver ODBC.
I "tipi" nella condizione Where sono giusti?  (CodiceDeposito e Listino non 
dovrebbero essere numeri)
 
ARTICOLI.DESCRIZIONE_BREVE Like    'Base*'   and PREZZI.CODICE_DEPOSITO='1' 
and
PREZZI.CODICE_LISTINO= '1'
 
Saluti
 
P.S:  Usa l'apice singolo ' al posto di quello doppio "
 
 


Si in effetti i campi PREZZI.CODICE_DEPOSITO e CODICE_LISTINO sono degli 
integer e quindi gli apici non ci vanno, non so perche' li abbia 
inseriti nel post
La query copiata la' ed incollata qua e':
 
SELECT ARTICOLI.CODICE, ARTICOLI.DESCRIZIONE_BREVE, PREZZI.ID_PREZZI, 
PREZZI.PREZZO, PREZZI.PREZZO_IVATO, CONTABILEDEPOSITITESTATE.ESISTENZA, 
CONTABILEDEPOSITITESTATE.DISPONIBILITA, PREZZI.CODICE_DEPOSITO, 
PREZZI.CODICE_LISTINO, PREZZI.CODICE_VALUTA FROM (ARTICOLI LEFT JOIN 
PREZZI ON ARTICOLI.CODICE = PREZZI.CODICE_ARTICOLO) LEFT JOIN 
CONTABILEDEPOSITITESTATE ON ARTICOLI.CODICE = 
CONTABILEDEPOSITITESTATE.CODICE_ARTICOLO WHERE 
ARTICOLI.DESCRIZIONE_BREVE Like "Base*" and PREZZI.CODICE_DEPOSITO=1 and 
PREZZI.CODICE_LISTINO=10
 
Come fare per vedere cosa 'passa' dal driver odbc?
In sostanza vorrei capire cosa viene inviato da Access al db server
Ho gia' provato col 'tracing' proprio del pannellino di controllo driver 
odbc ma oltre al rallentamento eternico introdotto, si capisce una mazza 
del log prodotto
 
 
 
 
 

 Oppure, piu' semplicemente, come fare per velocizzare le operazioni?
Ciao,
hai provato con una query passthrough?
 
Mat.

 Like "Base*" and PREZZI.CODICE_DEPOSITO=1 and PREZZI.CODICE_LISTINO=10
 
 
Gli Apici li ho aggiunti io, pensando tu li avessi dimenticati   ;-)
Hai provato a sostituire "Base*" con 'Base*'  ?
 
Saluti
 
 
 
 
 


Si, in effetti LA soluzione e' questa
Non avevo mai assegnato ad un recordset una query passthrough
Seguendo questo link ho fatto, ora la risposta e' istantanea
 
http://www.dbforums.com/showthread.php?1006185-Writing-Pass-Through-Queries-in-VBA
 
 
L'unica rognetta e' che cosi' l'sql da inviare e' diverso da quello che 
usa Access, nel like gli * diventano % e via discorrendo
 


 
Puņ farlo se gli basta un recordset non aggiornabile.
 
Saluti. 
 
 


Si avevo gia' provato, stessa cosa
Per risolvere ho usato una query passthroug, ora vola
 
---------------------------------------------
strConnection = "ODBC;DRIVER={Firebird/InterBase(r) driver};DSN=DSN_PIPPO;"
 
strQueryName = "Qry_Select_From_Tbl_Area"
 
If Test_SQL_PassThrough(strCon,strSql,strQueryName) Then
     Me.RecordSource = strQueryName
     End If
---------------------------------------------
 
la Test_SQL_PassThrough e' qua sotto
 
http://www.dbforums.com/showthread.php?1006185-Writing-Pass-Through-Queries-in-VBA
 

 Per risolvere ho usato una query passthroug, ora vola
 
 
Certo, ma la Form sarà a sola lettura.
 
Saluti 
 
 

 Saluti
 
Ovviamente.
 
Beh... può valutare un metodo usuale in questi casi, in cui le qPT sono ottime per per le maschere continue in ReadOnly, poi l'editing in maschera singola... con una estrazione semplificata con la PK...
Sempre fattibile anche con singola... e su Button Abilita EDIT si cambia il RecordSource sempre su interrogazione a singola PK...
 
Ovviamente farragginoso...
 
Mi chiedo se non ci sia un Query Analizer...
 
@Alex


 
 
Del resto non ha alternative se non riesce a far camminare la Query ODBC 
(ma può essere che in quella Form non fosse proprio previsto l'editing).
 
Saluti
 
 


Gia', mi basta 'vedere' i record richiesti e selezionarne uno