Newsgroup: it.comp.lang.visual-basic
Titolo: problema db mysql con più di 10000 record...

Vi espongo il mio problema :
Ho db mysql e da visual basic devo sparare una query "inner join " su due
tabelle con più di 10000 record.
Se il risultato della query mi tira fuori dai 1000 ai 2500 record, la mia
applicazione va alla grande, ma se il risultato arriva a circa 3500 record
incomincia a traballare (nel senso che mi da il classico messaggio " l'
applicazione non risponde", ma se aspetto qualche secondo funge ).
Il codice che uso è questo :
strConnection = "DSN=pippoMsql"
Set cn = New ADODB.Connection
cn.Open strConnection
strConnectionInsReport = "DSN=pippoAccess"
Set cnInsReport = New ADODB.Connection
cnInsReport.Open strConnectionInsReport
Set MyRecSet = cn.Execute("SELECT tabellaA.CKY, " & _
"tabellaA.RAGSOC, " & _
"tabellaA.INDIR, " & _
"tabellaA.CAP, " & _
"tabellaB.INVITO, " & _
"tabellaA.LOC, " & _
"tabellaA.PROV " & _
" FROM tabellaB INNER JOIN tabellaA ON tabellaB.CKY = tabellaA.CKY where
tabellaB.INVITO = 1")
While Not MyRecSet.EOF
Set MyRecSetInsReport = cnInsReport.Execute("INSERT INTO tabellaC " & _
            "(CKY,RAGSOC,INDIR,LOC,CAP,INVITO,PROV ) VALUES " & _
            "('" & MyRecSet.Fields.Item("CKY").Value & "'," & _
            "'" & StrConv(Replace(MyRecSet.Fields.Item("RAGSOC").Value, "'",
"''"), vbProperCase) & "'," & _
            "'" & StrConv(Replace(MyRecSet.Fields.Item("INDIR").Value, "'",
"''"), vbProperCase) & "'," & _
            "'" & StrConv(Replace(MyRecSet.Fields.Item("LOC").Value, "'",
"''"), vbProperCase) & "'," & _
            "'" & Replace(MyRecSet.Fields.Item("CAP").Value, "'", "''") &
"'," & _
            "'" & MyRecSet.Fields.Item("INVITO").Value & "'," & _
            "'" & UCase(Replace(MyRecSet.Fields.Item("PROV").Value, "'",
"''")) & "'" & _
            ")")
MyRecSet.MoveNext
Wend
In sostanza i dati della inner join fra tabellaA e tabellaB (db mysql
residente su un server  ) li inserisco in una tabellaC ( che si trova in un
db in locale Access).
Avete qualche suggerimento per velocizzare il processo ?

 Avete qualche suggerimento per velocizzare il processo ?
L'unica è fare eseguire l'insert direttamente in Access, collegando una 
vista di MySql come tabella di Access, e poi invocando una INSERT 
SELECT monolitica.
Alla fine, il giro dei dati è comunque da DSN a MDB, ma mi auspico che 
JET abbia qualche ottimizzazione.
ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 SELECT monolitica.
........

 Con un db Microsoft Sql secondo te il discorso cambia ?
Assolutamente no.
Il 99% del tuo problema di performance è lato client, ossia nel codice 
VB che cicla sul recordset e fa gli insert.
Che legga e scriva su Access, MySql, Sql-Server, cambia poco, se il 
join è fra tabelle sui 10.000 record (che sono oggettivamente 
un'inezia, a parte forse per Access, ma tanto su Access vai solo in 
Insert).
Quindi, collegando Access a MySql e facendo eseguire l'Insert a Jet, 
migliori parecchio rispetto a VB, ma altrettanto otterresti collegando 
Sql-Server a Access.
Ciao


Ho eliminato la parte insert.... per prova e i tempi sono lenti lo
stesso.... E' proprio la query con  inner join che non gli piace.... !!!
Forse è la versione del server mysql che deve essere aggiornata oppure il
driver che utilizzo per la connessione al db mysql
(MyODBC-standard-3.51.9-)...
help please !!!!

Dopo dura riflessione, ICETRAP ha scritto :

Non so se il provider che utilizzi abbia dei problemi, ma una Join di 
quelle dimensioni, alla seconda esecuzione deve essere quasi 
istantanea. E 3500 record che transitano in rete sono una fischiata.
Quindi, ci deve essere qualcosa d'altro.
Hai tolto solo l'insert (che poi non ti serve a niente farti generare 
un recordset ad ogni execute, se poi quel recordset non lo utilizzi), o 
anche il Loop?
Ciao


Il loop lo lascio e inserisco i risultati in una textbox....
Inoltre ho utilizzato do while e loop... invece di while not e wend e si č
velocizzato un pň.....
altro da dirmi... ? Please

 velocizzato un pò.....
La prima cosa da fare è individuare il collo di bottiglia.
Misura il tempo che serve per l'apertura del Recordset iniziale, e il 
tempo per il loop.
Poi vediamo qual'è il problema.


Ok fatto....
Dopo l'istruzione :
Set MyRecSet = cn.Execute("SELECT tabellaA.CKY, " & _
"tabellaA.RAGSOC, " & _
"tabellaA.INDIR, " & _
"tabellaA.CAP, " & _
"tabellaB.INVITO, " & _
"tabellaA.LOC, " & _
"tabellaA.PROV " & _
" FROM tabellaB INNER JOIN tabellaA ON tabellaB.CKY = tabellaA.CKY where
tabellaB.INVITO = 1")
ho inserito un bel
msgbox "pippo" e prima visualizzare il messaggio mi sono addormentato...
inoltre l'uso del processore è arrivato al 100% e c'è rimasto per un pò...
(20 secondi circa tutto il processo).

ICETRAP ha usato la sua tastiera per scrivere :

Terribile.
C'è qualcosa che non va.
Prova a ricreare gli indici, forse si sono disallineati.
Se veramente nelle tabelle hai un 10.000 record ciascuna, l'esecuzione 
sul server dura pochissimo (diciamo un secondo alla prima esecuzione, e 
un mezzo secondo dalla seconda esecuzione in poi).
A meno che tu non abbia una rete marcia, ma molto marcia, a livello di 
modem 56k, la cosa non può durare di più.


Ok ho creato un dbmysql clone sul mio pc ed ha impiegato quasi 4 secondi....
Ma quando provo dal pc ad un server mysql montato su linux, impiega molto di
pių....

 ha scritto nel messaggio > C'è


IMHO e' un problema di indici assenti ove servono.
MySQL ti spiega le ottimizzazioni che utilizza (e gli indici che usa) durante una query con il 
comando EXPLAIN, anteposto alla query.
Esegui la medesima query preceduta da EXPLAIN da console o da PHPMyAdmin (se lo hai installato), 
vedi quali indici usa (o userebbe, pero' non ci sono) e agisci di conseguenza.
Rif:
http://dev.mysql.com/doc/refman/5.0/en/explain.html
hth,
Lokar 

 ha scritto nel messaggio
news:49sh6oF...@individual.net...


 tabelle con più di 10000 record.
[cut]
Primo: che campo e' CKY? Di che tipo, intendo.
Secondo: Fai un join sul campo CKY ed uno where sul campo invito. Ok. Il 
campo CKY e' un indice? Nel caso crea un'indice anche sul campo Invito.

> IMHO e' un problema di indici assenti ove servono.
Se non fosse chiaro:
METTI DEGLI INDICI SUI CAMPI CHE VENGONO VALUTATI NELLA
CONDIZIONE (si, sto urlando).
hth,
Lokar