Newsgroup: it.comp.appl.access
Titolo: un'altra richiesta di aiuto me la consentite?

Ed ecco subito il mio problema:
Ogni mese viene redatto un archivio contenente un enorme numero di record
(ca 300.000):
1codice posizione
2nome posizione
3.......
tra due archivi puo' capitare che vi siano posizioni comuni e posizioni non
comuni.
Le posizioni non comuni possono essere considerate nuove se esistono
nell'archivio del tempo t1 e non esistono nell'archivio del tempo t0;
viceversa abbiamo posizioni eliminate se presenti al tempo t0 e non presenti
al tempo t1.
Allora il problema è che per verificare se effettivamente una posizione sia
nuova o eliminata ho necessità di riscontrarlo raffrontando ben vero i due
archivi t0 e t1 ma dopo ho necessità di effettuare una verifica del
risultato andando a ritroso fino a dodici archivi prima .
Se sono stato poco comprensibile fornirò altri chiarimenti.
C'è un modo per risolvere questo problema?
La necessità di verificare i dati con tanti altri archivi risiede nella
circostanza che una posizione puo' essere o meno presente in un archivio in
virtù di una circostanza esterna che non posso verificare in altro modo:
l'unica strada è appunto quella di verificare confrontando più archivi.
Grazie per la preziosissima collaborazione che potrete darmi e a buon
rendere.


Effettivamente è meglio scegliere un metodo almeno quasi perfetto per non
ritrovarsi a fare confronti su centinaia di miglioni di record!!
Tempo addietro ho dovuto affrontare lo stesso genere di problema anche se su
soli 2500 record per due tabelle da confrontare :-)
L'idea di base si fonda su due regole fondamentali:
Premessa:
    Se fai un confronto dove percorri la seconda tabella (per es. t1) per
intero per ogni record di t0 ti troverai nel caso peggiore a sorbirti n0xn1
confronti! In media diciamo (n0xn1)/2.
Regola 1)
    Le tabelle da confrontare devono essere ordinate rigorosamente allo
stesso modo con un o più campi (insieme di indici)che possono identificare
in modo univoco ogni records o perlomeno un gruppo ristretto di records
equivalenti.
Un esempio può essere in tabelle di un inventario dove in ogni tabella c'è
in indice il numero inventario dell'oggetto inventariato. Quindi se cerchi
fra due tabelle d'inventario degli oggetti eliminati o aggiunti, li puoi
vedere facilmente perché a un certo punto nella lista ordinata spunta il
numero inventario dell'oggetto aggiunto oppure, superato il numero
d'inventario che stai cercando, vorrà dire che quell'oggetto è stato
eliminato.
Da lì arriviamo alla seconda regola.
Regola 2)
    Grazie a quel ordine prezioso hai l'informazione necessaria per
diminuire fortemente il numero di confronti.
Partendo da una delle due tabelle (scegli tu quella che ti fa fare meno
passi con i tests di confronto), prendi l'indice definito prima e percorri
la lista finché non superi il suo valore. Se non lo superi vuol dire che hai
trovato lo stesso indice nell'altra tabella, invece se superi il valore vuol
dire che non l'hai trovato perché non c'è e quindi si presume che sia stato
eliminato!
A questo punto passi al secondo valore, sempre dell'indice, e CONTINUI da
dove ti sei fermato! E non ricominci in cima alla seconda tabella!!
Quindi se l'indice che hai definito ragruppa in media diciamo ni records
equivalenti (cioè con lo stesso valore di indice che tu hai definito) avrai
al peggio n0xni confronti da fare (in media n0x(ni/2), nel caso ni=1, rimane
n0x1).
Quindi il punto sensibile è di restringere al massimo ni. Se riesci a
ridurlo a ni=1 allora avrai "solo" 300.000 confronti da fare invece di
90.000.000.000/2
 da fare!!!
Quando avrai capito bene il principio di questo metodo, puoi ridurre ancora
di più il numero di confronti in funzione di quello che cerchi abbassando
anche a 150.000 se cerchi una cosa precisa e se non hai bisogno di
confrontare sistematicamente tutti i record di una tabella.
Per finire spero di aver capito bene il tuo problema perché, diciamo che non
ho scritto due righe...
Ciao
Thierry

La risposta gią data mi sembra buona e soprattutto ben informata...
l'unica cosa che aggiungerei č che mi fiderei un po' del motore del DB per i
confronti... in pratica farei uso estensivo delle JOIN, in modo che i confronti
decida il motore come farli.
Per dire qualcos'altro, dovrei capire un pelo meglio il problema, un esempio
sarebbe utile
Buon lavoro,
    Matteo


Ciao,
senza voler togliere nulla a quanto esposto da Thierry Rega e concordando
pienamente sulla Regola 1, non sarebbe sufficiente fare due query di ricerca
dei non corrispondenti (vedi autocomposizione query): una volta cercando i
non presenti al tempo t0 (nuovi) e una volta cercando i non presenti al
tempo t1 (eliminati)?
Fatemi sapere.
Silvio

risultato andando a ritroso fino a dodici archivi prima .
cioe' prima t0 con t1, poi t0 con t2 ecc. fino a t0 con t12?
comunque, per prima cosa setta un indice sul campo posizione.
poi: vedo che hai un campo codiceposizione e un campo nomeposizione.
i due campi sono in corrisondenza biunivoca?  cioe' ilnome e'solo
descrittivo del codice?  perche' se e' cosi' ed il codice e' un campo
di tipo numerico conviene lavorare su quello, i tempi sono migliori.
poi, i record sono 300mila e vabbe', ma quante possono essere le
posizioni?
forse conviene estrarre, per ogni tabella, un raggruppamento delle
posizioni.  se le posizioni sono solo una decina ottieni che devo
cercare su una tabella di dieci record anziche' di 300mila, cioe'
300mila*10 operazioni invece che 300mila*300mila.
insomma, si possono fare diverse cose ma servono piu' dettagli.
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/

 tempo t1 (eliminati)?
Premetto che queste query di ricerca le ho sempre fatte in VB perché ci sono
sempre condizioni particolari da tenere in conto, anche se organizzando bene
le tabelle da confrontare, effettivamente basterebbero delle query di
confronto.
Quello che magari sarebbe interessante verificare è il metodo di ricerca di
queste query, se seguono la regola 2) oppure fanno una cosa più "primitiva"
confrontando per ogni record tutti i record dell'altra tabella.
Spero di aver capito bene quello che intendevi, perché per far trovare i
nuovi o gli eliminati in una tabella, la query o il codice VB che sia dovrà
confrontare l'altra tabella... a meno che non ci sia qualche informazione
che nella tabella stessa (t1) ti permetta sapere quali sono i records
eliminati. Per quelli nuovi, se c'è un campo con un tempo preciso, si
potrebbe guardare semplicemente nella tabella t1 quelli che sono stati
immessi al tempo >t0.
In questo caso il discorso cade e basta una query (una per i nuovi e una per
gli eliminati) di quelle proprio banali.
Ciao
Thierry

 equivalenti.





 come?
Adesso non ho tempo per darti tutti i dettagli, ma in VB è abbastanza facile
perché è un gioco (sottile!) di for...next oppure do...loop per percorrere
le rispettive tabelle, e poi ci sono gli if...then per sapere su quale
record ti devi  fermare e quindi quale ripartire.
Devi stare attento a ripartire e a fermarti sui record giusti in modo da non
dimenticarne.
Infine per quel che riguarda le query non ho idea se conviene, bisogna
verificare semmai con due tabelle e vedere quanti confronti si fanno.
Non disperare se ci rifletti è molto più facile di quelli che speri.
Fammi sapere.
Thierry

una certa denominazione (o posizione) è presente o meno in archivio a
ok, andiamo per gradi.
se fai una query di raggruppamento per posizione, quanti record
ottieni?
intendo una cosa del genere:
select posizione from tabella group by posizione
