Principale utente con più risposte
Lentezza accesso a SQL Server in una LAN

Domanda
-
Salve a tutti,
ho una domanda da porre alla vostra cortese attenzione:
Ho fatto un semplice test per verificare le prestazioni di una data procedura vb6 che usa SQL Server 2008, precisamente:
- siamo in una LAN con un proprio dominio, in cui in una macchina server a 64 bit, che chiamiamo DOM, è installato come SO Win Server 2008.In questa LAN ci sono poche macchine collegate, 5 o 6 macchine.
- abbiamo inserito in questa LAN un nuovo server che ha un suo dominio, che chiamiamo SER, fornendogli un IP valido nella LAN. In questa macchina è installata la procedura VB6 che ho testato.
- Ebbene, il 1° test che ho fatto è stato quello di agganciare la procedura VB6 della macchina SER al mio PC Locale in cui ho un'istanza di SQL Server 2008 R2 Developer, in queste condizioni, la durata della esecuzione della esecuzione della procedura è stata ~ 46 minuti.
- Il 2° test è stato di creare nella macchina SER una istanza locale di SQL Server 2008 R2 express, e di lanciare la procedura; qui la durata della esecuzione della procedura è stata di ~ 11 minuti.
Avete riflessioni da propormi ? Si tratta di problemi LAN(a parte questi test la LAN funziona bene) che ignoro? Si tratta di una configurazione di SQL Server per funzionare in una LAN che non è stata fatta ?Ci potrebbero essere altre ragioni?
Spero di essere stato chiaro nell'esporre il problema.
Grazie per le eventuali risposte, arrivederci
NB:
Nel mio PC locale è disattivato il firewall, e nella macchina SER non esiste al momento un antivirus
- Modificato AngeloNew lunedì 28 aprile 2014 13:57
Risposte
-
perchè la tua applicazione estrae i dati, li trasporta dove c'è in esecuzione l'applicazione in vb6 e lì li elabora quindi fa traffico sulla rete.
se invece l'esecuzione va in locale sullo stesso server o perchè l'applicazione vb6 gira dove c'è sql o perchè la stessa elaborazione che fa l'applicazione vb6 viene fatta in t-sql mediante stopred procedures, tutta l'elaborazione diventa molto più rapida.
ciao.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org- Proposto come risposta Edoardo BenussiMVP, Moderator giovedì 22 maggio 2014 10:08
- Contrassegnato come risposta AngeloNew venerdì 23 maggio 2014 07:41
Tutte le risposte
-
prima di andare ad indagare su problemi di rete comincerei a verificare le risorse fisiche della tua macchina e del server SER. se il tuo pc ha 4GB di ram e 1 processore mentre il server ha 32GB di ram e 16 processori, il dubbio è presto risolto.
inoltre bisogna anche tenere conto dei processi in esecuzione sulle due macchine che sto comparando.
magari il server non fa nulla mentre il tuo client è "affaticato" oltre che dalla query in esecuzione anche dal fatto che tu stai facendo altri lavori usando altri programmi.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org
- Modificato Edoardo BenussiMVP, Moderator mercoledì 30 aprile 2014 09:00
- Proposto come risposta Edoardo BenussiMVP, Moderator mercoledì 30 aprile 2014 09:00
-
La mia macchina è un Core i7 a 3.5 GHz con 3 GB di RAM, mentre il Server SER ha 2 processori i7 a 3.3 GHz con 40 GB RAM.
Durante il Test, sia la mia macchina che il Server SER non hanno eseguito processi avviati da me, ma i soli processi in esecuzione erano del SO.
Un'altra precisazione, che ti può essere utile, e che mi fa dubitare sulle prestazioni della LAN, ho eseguito un 3° Test, cioè, ho eseguito la procedura VB6 di cui ti ho parlato nel mio PC con l'istanza SQL Server locale del mio PC, ed i tempi della procedura si discostano poco dai tempi ottennuti con il test che ho effettuato in locale nel Server SER.
Esiste qualche configurazione da fare ad un istanza SQL Server per lavorare meglio in una LAN?
- Modificato AngeloNew mercoledì 30 aprile 2014 13:54
-
puoi descrivere sommariamente cosa fa questa procedura in vb6 ?é
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
Sì,
Si tratta di una estrazione dati da alcune tabelle di un db in SQL SERVER, precisamente 4 o 5 tabelle in INNER JOIN fra loro da cui estraggo ~ 50000 records (rappresentano delle fatture di vendita a vari clienti)che popolano il mio DAO.Recordset; durante lo scorrimento del recordset inserisco i dati in 2 matrici, nella prima matrice, più o meno metti i dati del cursore, mentre nella 2a matrice inserisco con una piccola elaborazione i subtotali per cliente.
Tutto qua, è semplicemente una estrazione di dati.
-
su un normale trasferimento di dati sulla Lan qual'è il comportamento ?
ad esempio, se copi un file di un paio di giga dal client al server, quanto tempo ci mette ?
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
Spostando un file di ~4,07 GB
Dal mio PC (con Windows XP SP3 con scheda di rete da 1 Gb) verso SER(con scheda di rete 1 Gb), attraverso uno switch da 100 Mb, ci impiega circa 8 min.
Il viceversa :
Dal SER(con scheda di rete 1 Gb) verso il mio PC (con Windows XP SP3 con scheda di rete da 1 Gb) , attraverso uno switch da 100 Mb, ci impiega circa 6 min.
Questi sono i risultati.
-
Ciao Angelo, collega direttamente il PC alla scheda del server e rifai il test. Questo tipo di attività prevede almeno un controvalore (modifica porta Switch, modifica cavo di rete, etc.)
Saluti
Nino...esistono i motori di ricerca, facci un salto e troverai molte delle risposte che ti darò io.
-
Fare questo test mi risulta difficoltoso, e comunque se mi sposta un file di 4 GB in 6-8 min credo sia normale in una LAN a 100 Mb; significa usare velocità di 70-90 Mb/s che reputo normali.
inoltre credo che usando SQL Server in LAN con la procedura mia, che al massimo legge 50000 records da un DB, non sia come leggere 4 GB dalla LAN.
-
Ovviamente le due attività (trasferimento file e trasferimento query) sono differenti, ma se non hai dei punti di riferimento non puoi valutare le prestazioni. Se hai difficoltà a connettere il PC direttamente alla porta del Server prova ad utilizzare due diferenti porte sull switch.
Una veloce analisi la potresti fare con Performance Monitor per vedere cosa succede in quei 46 minuti.
Saluti
Nino...esistono i motori di ricerca, facci un salto e troverai molte delle risposte che ti darò io.
-
Ho fatto un altro test, con gli strumenti che ho a disposizione:
Ho sostituito lo switch a 100 Mb con uno di 1 Gb ed effettivamente qualcosa è cambiato, invece di 46 min c'ha impiegato 35 min.
Mancano ancora all'appello 35 - 11 = 24 min !- Modificato AngeloNew lunedì 5 maggio 2014 13:39
-
nelle prove che stiamo facendo c'è qualcosa che non mi suona bene: quando fai una query verso sql server dalla rete in realtà non fai altro che inviare una stringa che rappresenta la tua select, il server lavora per conto suo e ti restituisce il risultato quando la query è finita.
stabilito che questi sono i passi, il fatto che ci possa impiegare tanto solo quando la query viene fatta dalla rete mi fa pensare solo che la quantità di dati da restituire è tale che questa restituzione crea il collo di bottiglia.
la prova che farei io è
1) eseguire la query in locale e vedere il tempo di elaborazione di sql server
2) eseguire la query dalla rete e vedere il tempo di elaborazione di sql server
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
-
hai fatto bene a ricordare che si tratta di una procedura vb6: spero che la procedura non sia tale da fare traffico tra client e server ad ogni ciclo come se ad esempio usasse i cursori ed attendesse risposta dal server.
puoi eseguire proprio la procedura vb6 e verificare i tempi di esecuzione del server dopo avermi però confermato o smentito quanto ho scritto qui sopra.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
Ho eseguito la query SQL in locale e in Rete, utilizzando anche delle prequery che mi consentono di pulire il Buffer del Managment e i risultati sono questi :
Query in locale ~ 18 sec
Query lanciata dal Server SER su SQL Server del mio PC ~ 18 sec.
Ho fatto anche un'altra prova, facendo un piccolo eseguibile in ADO, visto che la mia procedura usa DAO, e solamente a scorrere con un recordset la query che mi interessa ci impiega come DAO.
-
Stamattina ho fatto un nuovo test, mi sono procurato un cavo crossato ad 1 Gb/s e ho eseguito nuovamente la procedura VB6, il tempo di esecuzione rispetto al test in cui ho usato uno switch ad 1 Gb/s non è cambiato, cioè, 35 min.
Mi chiedevo stamattina se, visto che uso un driver ODBC per accedere ai dati di SQL Server, se il driver ODBC si comporta diversamente nelle connessioni ad SQL Server in locale piuttosto che in rete?
Inoltre mi chiedevo se utilizzare porte dinamiche piuttosto che porte statiche nella configurazione client di SQL Server possa determinare differenze apprezzabili?
E se eventualmente usare la fibra ottica per collegare SER con il mio PC possa dare miglioramenti.
-
Le istruzioni VB6 per accerdere al mio DB SQl Server tramite ODBC sono :
Dim db AS DAO.Database
Set db = m_WorkSoc.OpenConnection(DbName(sName), dbDriverCompleteRequired, False, "ODBC;DSN=DsnProgramma;UID=" & sUser & ";PWD=12345;Database=" & DbName(sName))
db.QueryTimeout = 600- Modificato AngeloNew martedì 6 maggio 2014 09:03
-
prova a vedere se questo ti aiuta
http://serverfault.com/questions/181118/odbc-connection-is-extremely-slow
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
-
Un'altra cosa che vi vorrei dire è questa :
Frugando nel codice della mia procedura VB6, mi sono accorto che essa usa come driver odbc per accedere a SQL Server questo :
DBEngine.RegisterDatabase "DsnProgramma", "SQL Server", True, stringaConnessione,
cioè usa il file SQLSRV32.DLL
ed ho notato che ne esiste un altro più recente : SQLNCLI10.DLL
Può questo influire sul discorso che stiamo facendo ?
NB:
La procedura vb6 a suo tempo, alcuni anni fa, è nata per funzionare con SQL Server 2000, e dovrebbe consentirmi di fare questo ancora adesso.
-
-
In genere si tende ad utilizzare la versione più recente se si è certi che non si stanno utilizzando componenti obsoleti. ANche se la dll dovrebbe andare in retrocompatibilità sarebbe meglio aggiornare il codice.
A livello ODBC quale versione di client utilizzi?
...esistono i motori di ricerca, facci un salto e troverai molte delle risposte che ti darò io.
-
-
il comando
netsh interface tcp set global autotuninglevel=disabled
eseguilo sia sul server sia sul client.
la scelta del driver lasciala da parte al momento.
dopo aver disabilitato l'autotuning delle schede di rete riesegui il test e posta i risultati.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
Ho fatto le prove ieri sera:
ho provato come mi stai suggerendo a lanciare il comando sia sul server che sul mio PC, sul server è andato tutto bene, nel mio PC, che ha win XP, non ha riconociuto il comando; comunque facendo il test lo stesso non è cambiato nulla, l'esecuzione ci ha impiegato sempre ~ 35 min.
-
una domanda: ma stai facendo queste prove solo a scopo di test, perchè devi creare un ambiente di produzione o per quale altro motivo ?
perchè uno dovrebbe usare xp che è un sistema operativo ormai dismesso essendo terminato il supporto esteso lo scorso 8 aprile ?
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
Queste prove le faccio a scopo di test, uso XP, perchè nel mio PC effettuo le compilazioni VB6, e come sai, VB6 in altri ambienti a 64 bit darebbe problemi di installazione.
Stamattina volevo provare a cambiare la connessione a SQL Server usando il driver ODBC SQL Server Native Client 10.0.
Ti farò sapere, grazie al momento per i suggerimenti
-
Ho fatto la prova con il nuovo Driver ODBC SQL Server Native Client 10.0, sia nel Test in locale che nel Test in LAN ho recuperato 1 min., buono, ma per il Test in LAN è ancora poco.
Mi viene in mente adesso che la mia procedura VB6 si collega ad SQL Server tramite ODBC, con un utente che noi configuriamo in SQL Server, potrebbe essere qualche cattiva configurazione di questo utente in SQL Server o nel DB che uso ?C'è qualche impostazione per l'utente che attiene l'uso in LAN?
-
ti suggerirei di modificare l'applicazione in modo da non usare il driver odbc oltre, ovviamente, di cambiare macchina e sistema operativo per il tuo ambiente di sviluppo
ciao
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
-
puoi descrivere esattamente cosa hai sviluppato e con quale tecnologia ?
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
E' una applicazione VB6 che utilizza un DB in SQL Server tramite la connessione che ti ho descritto nei post precedenti, svolge diversi compiti, fatturazione, contabilità e altro.I test che ho fatto riguardano una funzione che utilizzo nella contabilità per estrarre le fatture dell'esercizio precedente, tramite una query corposa, e poi tramite varie elaborazioni, con vari accorpamenti, i dati vanno a finire in alcune matrici, ed infine da esse in dei file di testo che verranno poi importate da altre applicazioni.
-
I test che ho fatto riguardano una funzione che utilizzo nella contabilità per estrarre le fatture dell'esercizio precedente, tramite una query corposa, e poi tramite varie elaborazioni, con vari accorpamenti, i dati vanno a finire in alcune matrici, ed infine da esse in dei file di testo che verranno poi importate da altre applicazioni.
quindi tu lanci questa funzione dal client verso il sql server e l'esecuzione viene svolta tutta da sql server o viene svolta lato client dall'applicazione vb6 ?
perchè se l'esecuzione è lato client è ovvio che sia lento.
l'ottimizzazione vorrebbe che l'elaborazione dei dati sia fatta da stored procedures sotto sql server. la parte client dovrebbe limitarsi a mandare in esecuzione la stored procdure passandogli eventualmente i parametri necessari.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org -
L'applicazione VB6 estrae i dati in un recordset, con questi dati necessariamente da VB6 debbo fare dei raggruppamenti ed altre elaborazioni e spostare i dati in delle matrici. Comunque il problema non è questo, a me interessava sapere come mai la stessa procedura VB6 se lavora con una istanza locale di SQL Server ci impiega 10 min, e se invece uso un'istanza remota(nella stessa LAN) di SQL Server ne impiega 34 min.
-
perchè la tua applicazione estrae i dati, li trasporta dove c'è in esecuzione l'applicazione in vb6 e lì li elabora quindi fa traffico sulla rete.
se invece l'esecuzione va in locale sullo stesso server o perchè l'applicazione vb6 gira dove c'è sql o perchè la stessa elaborazione che fa l'applicazione vb6 viene fatta in t-sql mediante stopred procedures, tutta l'elaborazione diventa molto più rapida.
ciao.
Edoardo Benussi
Microsoft MVP - Directory Services
edo[at]mvps[dot]org- Proposto come risposta Edoardo BenussiMVP, Moderator giovedì 22 maggio 2014 10:08
- Contrassegnato come risposta AngeloNew venerdì 23 maggio 2014 07:41
-