Newsgroup: it.comp.lang.visual-basic
Titolo: [?][ADO] Apertura recordset lenta

   Win2000, Sqlserver2000, VB6SP5
Ho 2 database db e dbAS sullo stesso server
Alle tabelle contenute in db accedo in sola lettura, e ad alcune di 
quelle in dbAS anche in scrittura.
Quando lavoro in locale non ho grossi problemi, ma se lavoro con un 
sqlserver che si trova in Spagna (connesso con una linea dedicata non 
troppo veloce) l'apertura di alcune tabelle del dbAS e' lenta, lenta, 
leeeenta! Parliamo di circa 10 minuti (la sintassi la ho riportata piu' 
sotto).
La tabella in questione ha circa 50 campi e contiene piu' di 40000 
record (e va crescendo...).
L'apertura di tabelle di db contenenti anche 200.000 record non da 
invece problemi ...
Non sono riuscito a capire da cosa dipenda questo rallentamento.
Domande:
-ado.open "tabella" ....    carica tutti i record?
-Ho sbagliato la scelta di qualche parametro di apertura del database o 
del recordset?
-Come posso migliorare le prestazioni? L'utilizzo di un server remoto e' 
  un caso limite, mi serve solo per fare debugging, ma evidentemente 
anche le prestazioni in locale ne risentono...
-Siccome in questa tabella devo solo inserire record, l'utilizzo della 
sintassi con INSERT INTO ... puo' migliorare le prestazioni? (Ora apro 
il recordset ed uso !campo1=valore1: !campo2=valore2: .Update)
grazie
		maxx
' apre la connessione al db1
     Set db = New Connection
     db.CursorLocation = adUseClient
     ' Specify the OLE DB provider.
     db.Provider = "sqloledb"
     ' Set SQLOLEDB connection properties.
     db.Properties("Data Source").Value = get_dbinfo.server
     db.Properties("Initial Catalog").Value = get_dbinfo.dbRetail
     ' Decision code for login authorization type: WinNT or SQL Server.
     db.Properties("User ID").Value = get_dbinfo.user
     db.Properties("Password").Value = get_dbinfo.pwd
     db.Open
     ' apre la connessione al db2
     Set dbAS = New Connection
     dbAS.CursorLocation = adUseClient
     ' Specify the OLE DB provider.
     dbAS.Provider = "sqloledb"
     ' Set SQLOLEDB connection properties.
     dbAS.Properties("Data Source").Value = get_dbinfo.server
     dbAS.Properties("Initial Catalog").Value = get_dbinfo.dbSql2as
     ' Decision code for login authorization type: WinNT or SQL Server.
     dbAS.Properties("User ID").Value = get_dbinfo.user
     dbAS.Properties("Password").Value = get_dbinfo.pwd
     dbAS.Open
--cut
'questa e' la sintassi che uso per aprire il recordset
     Dim adoRSprmt As Recordset
     Set adoRSprmt = New Recordset
     adoRSprmt.ActiveConnection = dbAS
     adoRSprmt.Open "tabella", , adOpenForwardOnly, adLockOptimistic
'e qui aspetto 10 minuti .... :-(	

    Win2000, Sqlserver2000, VB6SP5
cut

 con sql funziona lo stesso!)..
Oltre a tutto quello che ti è già stato detto ..
se hai una linea dedicata (per cui non sei costretto a lavorare con ASP e
script vari) potresti anche usare i recordset disconnessi (o in modalità
fetch) ; questo non vuol dire ottenere prestazioni  superiori a quelle di
una connessione fissa ma se i dati vengono visualizzati direttamente
all'utente potresti ottenere effetti più gradevoli.
Saluti

 fetch) ;
Questa dei recordset disconnessi è proprio una moda......
a mio modesto avviso usare un cursore client o un recordset disconnesso
non fa proprio differenza.."in linea di massima." (parlando di prestazioni )
Cioè non si può dire non usare i cursori client e poi dire usa recordset
disconnessi
L'uno senza l'altro...e come si fà? Se me lo spiegate!
mi spiego meglio...in ambedue i casi ti spari giù tutta la tabella sul
client....(credo).
mi dite che senso ha usare sti recordset disconnessi...
L'unico caso in cui mi viene in mente è quello di risparmiare risorse per il
server per lasciarlo
libero di processare richieste concorrenti ..ma altrimenti?
Aperto a qualsiasi critica e sicuro di ver scritto Boiate.Ma visto l'orario
che ci volete fare?
Ciao
Lorenzo

'e qui aspetto 10 minuti .... :-(	
Se non ti servono tutti i campi, richiedi solo quelli che ti servono:
SELECT campo1, campo2, campo3 FROM tabella
Se devi solo inserire, puoi evitare di farti restituire righe,
usando un filtro come questo:
SELECT campo1, campo2, campo3 FROM tabella
WHERE 0=1
In ogni caso, se non devi visualizzare tutti i record (non penso
che l' utente voglia scorrersi tutti i 40000 record in una griglia,
applica un filtro per ridurre il numero di righe ed apri il recordset
lato server, cosi' al massimo dovrebbero arrivarti un centinaio
di righe per volta.
La gestione che stai facendo va bene per dei db access in locale,
ma non per db client server remoti.
Se in precedenza hai lavorato con access, imho ti conviene
dimenticare tutto.
-- 
hth, hal

WHERE 0=1
Ripensandoci, ancora meglio sarebbe scrivere una stored procedure nel
db che esegua l' opeerazione di inserimento.
Dal lato client, la invochi tramite un command, impostandone i parametri.
Ti rimane cosi' un codice piu' generico e avulso dalle seccature di apici,
formati numerici, formati date e cosi' via.
-- 
hth, hal

 hal1961 ha scritto:
CUT

...a quando un programma scritto insieme? :-P
Un progettino ci sarebbe, se parla sempre da un meeting all' altro,
poi, purtroppo, il tempo e' quello che e' :-(
-- 
ciao, hal


:-)
ciao
ugo