Newsgroup: it.comp.lang.visual-basic
Titolo: Ottimizzazione Database

Vorrei dei suggerimenti per velocizzare una insert particolarmente
lenta.
Ho una tabella A in cui ci sono 7 campi di cui uno numerico.
Una seconda tabella B è speculare alla prima (ha solo un campo
in più dove identifico l'utente).
L'utente utilizza in continuazione la tabella inserendo dei valori.
Se i primi 6 campi coincidono invece di fare una insert effettua una
update del campo numerico incrementandolo.
Il problema si pone quando l'utente chiude l'applicazione, in quanto tutto
il contenuto della tabella A deve essere riversato nella tabella B.
Qui devo effetturare gli stessi controlli cioè per ogni record della tabella
A devo controllare che nella tabella B i primi 6 campi siano differenti,
in tal caso effettuare una insert, altrimenti effettuare una Update.
Il problema per pochi record non si pone, ma se la tabella A ha 100 record
e la tabella B che è riassuntiva di tutto un mese ne ha 10.000 confrontando
record
per record devo fare 100*10.000 = 1.000.000 di confronti.
A parte le prestazioni del database che è un DBF come posso fare?
La creazione di un indice, mi aiuta parecchio, ma un indice su tutti questi
campi
(6) mi crea dei file MDX più grossi della taballa stessa, inoltre penso che
anche
per creare un indice ci siano diverse scelte. Meglio un indice unico su più
campi
o più indici?
Spero di esser stato chiaro e grazie per il tempo dedicatomi (anche solo a
leggere
il post).
danilo
P.S.
Per chi ha tempo e/o voglia inserisco anche il codice sorgente
 While Not rstr.EOF
            'Memorizzo il contenuto del record temporaneo per confrontarlo
            'con quelli della tabella delle statistiche
            data = rstr!giorno
            corrispond = rstr!corrispond
            societa = rstr!societa
            media = rstr!media
            motivo = rstr!motivo
            lineaprodo = rstr!lineaprodo
            ncontatti = CInt(rstr!ncontatti)
            Username = rstr!corrispond
            sqlStatistiche = "select ncontatti from tstatis where " & _
                "giorno='" & data & "' and corrispond='" & corrispond & _
                "' and societa='" & societa & "' and " & "media='TEL' and "
& _
                "motivo='" & UCase(motivo) & "' and lineaprodo='" &
lineaprodo & "'"
            Set rstStatistiche =
DataLinee(1).Database.OpenRecordset(sqlStatistiche, dbOpenDynaset)
            If rstStatistiche.RecordCount <> 0 Then
                rstStatistiche.Edit
                rstStatistiche!ncontatti = CInt(ncontatti) + 1
                rstStatistiche.Update
                rstStatistiche.Close
            Else
                str = "insert into tstatis (giorno, corrispond, societa,
media, motivo, lineaprodo, ncontatti) values ('" & _
                    data & "', '" & corrispond & "', '" & societa & "', '" &
media & "', '" & UCase(motivo) & "', '" & lineaprodo & "', " & ncontatti &
")"
                    DataLinee(1).Database.Execute str
            End If
            rstr.MoveNext
        Wend

 lenta.
[CUT]
Se ho capito il problema, intendi tenere in un campo numerico (NContatti) il
numero di record che hanno i primi 6 campi uguali.
Tu parli di tabella A e B, ma nel codice sorgente vedo solo la B (TStatis).
Supponiamo che:
tabella A = tabella con tutti i record da raggruppare = TStati
tabella B = tabella statistica con il numero di contatti = TStatiS
Prova questa istruzione:
INSERT INTO TStatis (giorno, corrispond, societa, media, motivo, lineaprodo,
ncontatti, username)
SELECT Giorno, Corrispond, Societa, Media, Motivo, Lineaprodo, Sum(NContatti),
Corrispond
FROM Tstati
GROUP BY Giorno, Corrispond, Societa, Media, Motivo, Lineaprodo;
Ovviamente la tabella di destinazione deve essere prima pulita, altrimenti
otterrai degli errori (si potrebbe fare una query simile ma solo in
aggiornamento). Non ho provato le prestazioni, ma sicuramente sarà 1 query
contro le 2 (per ogni record) che fai ora.
Spero di aver capito il problema e di esserti stato utile.
Michele
--
Per l'e-mail togli "xxx".
Home page: 
http://spazioweb.inwind.it/fochinet

 Meglio un indice unico su più campi o più indici?
Meglio un indice unico su più campi. Dovrebbe pure pesare meno della somma
dei diversi indici, e nel tuo caso avere un indice per ogni campo non ti
serve.
Ma perché hai bisogno di una tabella intermedia? Non puoi lavorare
direttamente sulla tabella finale?
Ciao
*Roby*

 direttamente sulla tabella finale?
No non posso perchè sono delle statistiche rilevate da diversi utenti
e alla fine della giornata di lavoro vengono accodate ad una tabella
riassuntiva.
Grazie per la dritta sugli indici.
                                    danilo