Newsgroup: it.comp.appl.access
Titolo: Query lenta dopo cambio server

Cerco aiuto per un grosso problema accaduto dopo la sostituzione di un
server.
Server "Vecchio": Windows 2003 standard edition in italiano
Server "Nuovo": Windows 2003 R3 standard edition X64 in inglese
In entrambi i server è installato Access 2003 e sono stati installati
tutti gli SP e fix. Le impostazioni delle "Opzioni" sono identiche.
IN LOCALE, ho una tabella con 300000 record formata da tre campi:
ID: contatore, chiave primaria
Operatore: campo numerico
Matricola: campo testo
Nella query applico il seguente filtro:
Operatore = 7
Matricola = Is null
Se eseguo questa query sul server vecchio ottengo il risultato in un
paio di secondi; sul server nuovo 9 volte su dieci ottengo il
risultato in circa 5 minuti mentre 1 volta su dieci in una frazione di
secondo.
Ho risolto il problema indicizzando sulla tabella il campo "Matricola"
ma non riesco a capire come mai sul nuovo server, che tra le altre
cose è molto più potente, ci sia tutta quella differenza.
Ho già fatto diverse prove:
- sempre con il db in locale ho eseguito la query anche su un pc con
XP e su un altro server Windows 2003 R3 X32 in inglese; la query viene
eseguita in un paio di secondi
- sul nuovo server, se nella query al posto di "is null" filtro ad
esempio "MAN10", ottengo il risultato in una frazione di secondo;
posso quindi dedurre che è "is null" a dare fastidio
- sul nuovo server ho provato a filtrare campi con formati diversi
sempre con "is null" e il problema rimane
Va bene che indicizzare i campi non fa mai male ma devo capire perchè
su questo server ci sia questo problema.
Sarà forse il fatto che il sistema operativo è a 64 bit? Non mi spiego
però come mai una volta su dieci la query viene eseguita in una
frazione di secondo.
Spero che qualcuno possa aiutarmi

Ho risolto il problema indicizzando sulla tabella il >campo "Matricola"
Allora l' architettura interna dei dati del server nuovo
e' diversa. Non c'e' altra spiegazione.
A meno che ...
Come e' scritta precisamente la query ? Come la
instradi al server ? Con che protocollo il client
comunica col server ? In che modo fisico le macchine
sono connesse ?

 sono connesse ?
SELECT MovimentiCommesse.ID, MovimentiCommesse.Operatore,
MovimentiCommesse.Matricola
FROM MovimentiCommesse
WHERE (((MovimentiCommesse.Operatore)=7) AND
((MovimentiCommesse.Matricola) Is Null));
Ripeto che sono in locale sul server. Non sfrutto ne la rete, ne
protocolli.

 ((MovimentiCommesse.Matricola) Is Null));
Mh. Sembrerebbe tutto normale.
Quel fatto dell' indice mi fa pensare all gestione della paginazione
della memoria VIRTUALE. Ed in quel caso sono cazzi, come ce le
metti le mani a  quel livello ?
Lanciala e controlla l' uso della memoria sul coso ... Come se
chiama ... Vabbe' ci siamo capito no ? Quello che esce quando
fai cntrol - alt - delete.
Vedi un po' ... Fammi sapere

 Vedi un po' ... Fammi sapere
Appena apro l'applicazione il db occupa 17000k di memoria; quando
eseguo la query l'utilizzo di memoria schizza prima a 24000k e poi
sale gradualmente di circa 60-70k al secondo. Alla fine della query,
l'utilizzo rimane a 36000k
Rifacendo la stessa operazione con il campo indicizzato, all'apertura
il db occupa sempre 17000k e dopo aver eseguito la query, l'utilizzo
della memoria è a 18500k
In entrambi i casi l'utilizzo della CPU è praticamente nullo

 In entrambi i casi l'utilizzo della CPU è praticamente nullo
E certo. Questo e' un altro indizio a riprova.
Perche' lui usa sicuramente la tecnica DMA (Direct Memory
Access) : praticamente ha un' ALTRA cpu DEDICATA alla
quale la cpu principale DELEGA il caricamento e lo scaricamento
dei dati della PAGINAZIONE della memoria virtuale da e a il
disco rigido.
Quindi la cpu principale fa poco o nulla, pero' la cpu della DMA
s' intoppa per l' eccessivo carico. Ma non sempre, perche'
evidentemente
ha un gestore evoluto che (sotto condizioni che mi sfuggono) si
conserva
talvolta i dati e se gli fai una query analoga ti spara quelli, e fa
prima.
E' probabile che se fai la stessa query dopo poco che ha finito la
prima
ti risponda molto velocemente. Vedi un po ...
Se invece usi l' indice, allora in qualche modo lui si carica solo i
puntamenti,
e l' uso della memoria (e quindi della paginazione e quindi degli
accessi al
disco), e' molto piu' limitato.
Io al posto tuo azzererei tutto il server e reinstallerei tutto da
capo,
access compreso. Alle volte funziona.
Famme sape'.

Intanto ti ringrazio ancora. Credo che tu abbia azzeccato in pieno il
problema.
Ho dato un occhio alle impostazioni delle prestazioni del SO ed ho
visto che si può assegnare una percentuale di utilizzo maggiore di
memoria ai programmi o alla cache di sistema. Nel mio caso, di default
era assegnato alla cache di sistema. Mi sono documentato e su un
articolo della microsoft è scritto che se il server viene utilizzato
prevalentemente come workstation (come nel mio caso), è preferibile
dare maggiore importanza ai programmi. Tra l'altro ho gurdato anche
sul vecchio server ed era settato su programmi.
A questo punto ho cambiato il valore ma perchè la modifica abbia
effetto devo riavviare il server, che è già in produzione. Se riesco
lo faccio durante la pausa pranzo, altrimeni lo faccio domenica. In
ogni caso posterò il risultato.
A presto...

 A presto...
Si, fammi sapere.
Scrivi in questo 3D pero' senno' ti perdo.
Ciao. E in bocca la lupo !

 Dai retta a questo fesso.
Mi fido ma il db in questione è decisamente complesso, comprende un
sacco di query, tabelle e funzioni. Tra l'altro è stato sviluppato da
una ditta esterna e una eventuale analisi dovrebbe essere fatta da
loro. Il mio obbiettivo comunque non è agire per ottimizzare l'mdb,
visto che su altre macchine è piuttosto performante; più che altro
vorrei trovare l'inghippo su questo server che fa si che si comporti
in maniera diversa dagli altri.

 sistema ma purtroppo non ho avuto risultati migliori.
... !
A questo punto non saprei davvero cosa dire.
Continuo a credere pero' che sia un problema di eccessiva
paginazione. Altrimenti non si spiegherebbe la differenza
con e senza indici.
Adesso il task manager che ti dice quando esegui la query ?
Ce l' hai il tasto "monitoraggio risorse" sempre nel task manager
per vedere gli accessi al disco ?
P.S.
Insisto : ti ci vuole un sistemista, e anche molto molto bravo.

 Insisto : ti ci vuole un sistemista, e anche molto molto bravo.
Vabbè, per adesso il problema l'ho tappato indicizzando i campi. E'
chiaro che l'anomalia è ancora presente su questo server e più avanti
potrebbe darmi dei problemi; tempo permettendo proverò a documentarmi
meglio per cercare di risolvere definitivamente.