Newsgroup: it.comp.appl.access
Titolo: Problema su lettura tabella in multiutenza

Ciao a tutti, una domanda: come si può 'snellire' la sola lettura di una tabellona su cui devo fare delle ricerche (è un catalogo....) in multiutenza? La tabella è la base di una form richiamata da codice con una variabile d'ambiente che passa la stringa SQL e la form è già in sola lettura (snapshot) solo che le ricerche contemporanee sono mooooolto lente....consigli?
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 
Perdonami ma non e' chiaro.
La ricerca su una stazione sola e' veloce?
Cos'e' la tabellona? (Volumi)
Che ricerche devi fare?
La query ha delle "IN"?
--
ac

Alessandro Cara ha scritto:

Scusa Alessandro, chiarisco: ho un catalogo in cui fare ricerche, composite (titolo, autore, editore, anno di pubblicazione....) dove posso ricercare per iniziale o per contenuto su tutti i campi. La tabella contiene circa 500000 righe, ogni riga circa 30 campi. In una LAN, una ricerca media per contenuto in campi compositi richiede circa 10 sec, per iniziali circa 2. Se però attivo un altro client (utilizzo XpUnlimited) anche la ricerca per iniziali (contemporanea su 2 client) in un campo solo richiede + di 30/35 secondi. La clausola SQL è senza IN, ed è impostata sulla tabella archivio, + outer join sulle tabelle di decodifica. Per il filtro metto tutto nell'espressione WHERE, concatenando i vari campi della form di ricerca. Ovviamente il WHERE può coinvolgere tutte le tabelle dell'espressione SQL. Spero di aver chiarito un po' le cose....
Intanto grazie!!


Fair87 ha scritto:

come direbbero gli americani "is a real pain in the ass".
A quanto dici ci sono 2 punti particolarmente critici
1) La ricerca su tutti i campi, che immagino non sono tutti indexati
2) Le join
Non ho una soluzione pronta in tasca e credo bisogna cominciare a 
definire dove e' il "reale" problema
1)
Sarebbe il caso di mettere su la tabella di "explain", che purtroppo non 
mi ricordo esattamente come attivare (forse c'e' qualcosa sul sito di 
Baraldi), per capire quali sono le strategie di accesso del DB.
2)
Eliminare le join per capire quale incidenza hanno
3)
Se non presenti, mettere su gli indici per le ricerche piu' frequenti
3)
Se ci sono delle "or" sui criteri verificare se queste portano alla 
esclusione della lettura per indici e trovare un "workaround" (i.e. uso 
di union). Fermo restando che ricerche per like, mi sembra, portano 
nella maggioranza dei casi ad accesso per "tablescan".
4) XPUnlimited e' quella roba che "surroga" il terminal server? Se e' 
cosi' diventa un fattore da osservare attentamente poiche' puo' essere 
un collo di bottiglia non indifferente
5)
Sarebbe comunque il caso che ci fai vedere lo "skeleton" della query
6)
Se non si riesce a trovare una "terapia" corretta, usare il bisturi e 
passare ad un DBMS piu' "DBMS"
--
ac


Dunque: tutti i campi in cui posso ricercare sono indicizzati (infatti prima nn si muoveva neanche in locale!!). XpUnlimited è una tecnologia TerminalServer, ma dovrebbe essere + leggera (in teoria....). Sto anche provando l'accesso in multiutenza classico (un FE x ogni client) x vedere se c'è differenza.....
Ho implementato anche il db su SQL server 2005 express (ma x ora solo in locale) tramite ODBC e, ovviamente, le prestazioni sono un 'pochino' diverse......tranne alcuna, ma sicuramente dovute alla mia scarsa conoscenza di SQL server e l'architettura errata del db magari... La query te la posto....è una ricerca abbastanza pesante x il sistema...niente OR solo AND. Intanto grazie.....
*********INIZIO
SELECT LIBRI_BASE.EAN, LIBRI_BASE.COD_ALT, LIBRI_BASE.AUTORE, LIBRI_BASE.TITOLO, LIBRI_BASE.SUB_TITOLO, LIBRI_BASE.GIACENZA, LIBRI_BASE.COLLANA, LIBRI_BASE.COLLANA_N, LIBRI_BASE.PREZZO, LIBRI_BASE.DISP_DA, LIBRI_BASE.DISP_INT, LIBRI_BASE.DISP_CLESP, LIBRI_BASE.SCUOLA, LIBRI_BASE.SPESE_FISSE, LIBRI_BASE.COLLOCAZIONE, LIBRI_BASE.ESCLUSO_CARD_COSMO, LIBRI_BASE.ANNO_ED, LIBRI_BASE.ANNOTAZIONI, LIBRI_BASE.CURATORE, LIBRI_BASE.ESCLUSO, LIBRI_BASE.VOLUME, EDITORI.RAG_SOC_E, TIPO_SCU.DESCRIZIO FROM (LIBRI_BASE INNER JOIN EDITORI ON LIBRI_BASE.EDITORE = EDITORI.COD_EDIT) INNER JOIN TIPO_SCU ON LIBRI_BASE.SCUOLA = TIPO_SCU.TIPO_SCU WHERE TITOLO LIKE '*mare*' AND TITOLO LIKE '*legno*';
**********FINE
Senza le join è tutto + veloce...ma ho solo i codici degli editori, allegati.....e nn le descrizioni....avevo anche pensato di fare un db 'piatto'....ma proprio nn mi piace.......
Rigrazie...


 conoscenza di SQL server e l'architettura errata
Ciao,
il problema è che access quando lanci una query si carica in locale tutta le 
tabelle interessate e dopo effetua la query!
500.000 righe quindi non sono poche!
Forse, le prestazioni degradano sulla seconda interrogazione da parte del 
secondo client perchè trova la tabella loccata dal primo ....
Con SQL, hai provato a fare una pass-trough, nella mia esperienza in SQL, 
una soluzione la trovi sempre..... perchè hai gli strumenti per verificare 
dov'è il collo di bottiglia, tipo guardare l'execution plan della query, che 
ti dice il peso in secondi di ogni istruzione che il motore esegue per 
rispondere alla tua query.
Le join alla fine sono 2, e non sono tantissime, nel tuo caso è la mole di 
dati che aggravia il tempo di esecuzione. Cmq... mi appassionano sempre le 
ottimizzazioni di query... per cui seguirò la tua vicenda in attesa che 
qualcuno ti dia il consiglio giusto



Ciao Marco, credo proprio che il problema sia proprio la contemporaneità degli accessi.....su SQL server mi sa che problemi nn ne avrò (oltretutto mi serve solo la selezione, quindi anche senza qry PT dovrebbe funzionare uguale....farò saper gli sviluppi....intanto grazie a tutti!! E, ovviamente, se avete altre dritte.....io sono qua!


> 
Una sola domanda.....cos'è il controllo cbx? e il soundex? Avevo provato con un self join a runtime su una tabella dove avevo memorizzato tutte le parole 'chiave' del campo titolo....ma purtroppo la banca dati fa schifo..e molte parole sono tronche...le prestazioni erano mooooolto migliorate ma nn è una strada percorribile..attualmente......


 
--
ac

Alessandro Cara ha scritto:

Eggia Alessandro, Infatti ho lasciato perdere il dizionario ma nn lìho cancellato (nn si sa mai). Per il self (forse mi sono espresso male) è xchè partendo dal dizionario duplicavo la tabella tante volte quante erano le parole da cercare nel diz stesso (cerco casa della bambole di pezza x es, devo cercare nel diz casa bambole pezza, gli articoli li pulisco) e quindi faccio dizionario join dizionario1 join dizionario2, tutto con AND. Ho, per aiuto, anche delle caselle di riepilogo per ogni campo (tipo 'filtro') che poi ricercano per stringa fissa, e sono velocissime in ogni occasione. Certo che invece, aprirle, vista la banca dati, nn è così veloce, ma una volta caricate sono un fulmine!!!! Per chiarezza mi sto facendo un gestionale per la mia libreria......il soundex lo conoscevo solo di nome, volevo anche studiarlo per evitare i campi duplicati nelle anagrafiche con un po' più di precisione...grazie mille di tutto
Roberto


 Rigrazie...
L'accesso tramite XPUnlimited, per ogni client, lo fai sullo stesso FE? Se è 
così prova a dividere gli FE per ogni client che deve interrogare il BE...
Ciao.
-- 
Sergio MAZZA 

"Fair87" <roby.ces@gmail . com > ha scritto nel messaggio 

Ciao Sergio, no sono tutti FE diversi. Ho creato tanti utenti sul 'server' quanti sono i client (x ora 1 per prova....), nella sua cartella ho posizionato l'mde e accedo direttamente a quello....ma comincio a credere che sia una gara persa.....la mole di dati è troppo grande x Access.....ho provato (ma nn è farina del mio sacco) anche a dividere i dati, quelli in uso e un archivio, locale x ogni client in modo da poter lavorare su meno dati...sto ancora testando......ma mi sa che l'unica soluzione è SQL server......acc....


 server......acc....
Aspetta che non capisco.
Se hai creato diversi FE, significa che hai duplicato lo stesso FE per ogni 
utente?
Ma se dici che hai un solo utente XPunlimited come fai a testare l'accesso 
simultaneo, ai dati, di due utenti?
Ciao.
-- 
Sergio MAZZA 

"Fair87" <roby.ces@gmail . com > ha scritto nel messaggio 

Hai ragione...salto dei pezzi....allora: per testare la multiutenza ho sperimentato questo setup. BE su un PC (che chiamo server). Ho una LAN di 3 pc (vecchi e poco potenti). Ho fatto il test nel peggior caso. Lancio 2 client, client1 collegato al server normalmente, client2 collegato a client1 com XpU come utente e da qui lo collego al BE. Spero di aver chiarito la situazione.....grazie intanto


 ha scritto nel messaggio 
news:g98fia$d3i$1...@news.nonsolonews.it...

Ciao,
giusto per toglierti qualche dubbio hai provato in LAN senza XPunlimited... 
come funzionano le cose?
Ciao 

news:g98fia$d3i$1...@news.nonsolonews . it ...

Molto meglio........il problema (assolutamente risolvibile) è che un pc ha si win98, e A2003 nn va.....e la conversione ad A2000 s'intoppa xchè (mannaggia a me) ho usato tra i riferimanti la libreria Office 11.0 che ovviamente nn è disponibile.....quindi nn si avvia (uso i fileDialog). Potrei ovviare usando le API x le finestre di dialogo e usare tutto in rete normalmente, ma leggevo che i rischi di corruzzione aumentano in una LAN e diminuiscono con tecnologie TerminalServer.....nn sono molto ferrato sull'argomento.....mi sa che la soluzione + rapida è comprare un pc nuovo.....


 chiarito la situazione.....grazie intanto
[risposta]
Alt! "...client2 collegato a client1..."??!!
Ciao.
-- 
Sergio MAZZA 

"Fair87" <roby.ces@gmail . com > ha scritto nel messaggio 

si.....attualmente è l'unico con XpU.....volevo provare una situazione aberrante....pensando...se è accettabile così nn può che migliorare.....cmq ho provato anche client1 e server insieme...ilo server va che è una meraviglia, il client1 fa un po' di lingua me meglio di prima...


 prima...
[risposta]
In effetti non è una situazione "normale"; io con:
2 pc in locale e uno dei due ha XPunlimited + 1 collegato via ADSL non 
riscontro rallentamenti. Ma ogni utente (sia locale che remoto) ha il suo 
FE...
Ciao.
-- 
Sergio MAZZA 

"Fair87" <roby.ces@gmail . com > ha scritto nel messaggio 

Certo, 1 FE per ogni client...server, client1 e client2 (su client1 ma utente separato con il suo FE)
