none
Lentezza accesso a SQL Server in una LAN RRS feed

  • 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
    lunedì 28 aprile 2014 13:53

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

    giovedì 22 maggio 2014 10:08
    Moderatore

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


    mercoledì 30 aprile 2014 08:58
    Moderatore
  • 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
    mercoledì 30 aprile 2014 13:44
  • puoi descrivere sommariamente cosa fa questa procedura in vb6 ?é

    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    venerdì 2 maggio 2014 10:06
    Moderatore
  • 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.

    venerdì 2 maggio 2014 13:27
  • 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

    domenica 4 maggio 2014 05:40
    Moderatore
  • 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.

    lunedì 5 maggio 2014 09:48
  • 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.

    lunedì 5 maggio 2014 10:25
    Moderatore
  • 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.

    lunedì 5 maggio 2014 10:55
  • 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.

    lunedì 5 maggio 2014 11:29
    Moderatore
  • 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
    lunedì 5 maggio 2014 13:38
  • 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

    lunedì 5 maggio 2014 13:59
    Moderatore
  • Per eseguire la query in locale intendi eseguirla in SQL Management Studio, separatamente dalla procedura vb6 ?
    lunedì 5 maggio 2014 14:32
  • 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

    lunedì 5 maggio 2014 14:46
    Moderatore
  • 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.

    lunedì 5 maggio 2014 18:14
  • 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.

    martedì 6 maggio 2014 08:35
  • 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
    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

    martedì 6 maggio 2014 16:36
    Moderatore
  • Il comando

    netsh interface tcp set global autotuninglevel=disabled

    che mi suggerisce lo dovrei eseguire nel Server SER o  nel mio PC ?

    martedì 6 maggio 2014 17:23
  • 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.

    martedì 6 maggio 2014 17:28
  • Client

    ...esistono i motori di ricerca, facci un salto e troverai molte delle risposte che ti darò io.

    martedì 6 maggio 2014 17:40
    Moderatore
  • 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.

    martedì 6 maggio 2014 17:42
    Moderatore
  • uso  il file SQLSRV32.DLL
    martedì 6 maggio 2014 18:24
  • 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

    mercoledì 7 maggio 2014 07:58
    Moderatore
  • 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.

    mercoledì 7 maggio 2014 08:08
  • 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

    mercoledì 7 maggio 2014 08:22
    Moderatore
  • 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

    mercoledì 7 maggio 2014 09:37
  • 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?

    mercoledì 7 maggio 2014 14:54
  • 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

    martedì 13 maggio 2014 12:35
    Moderatore
  • Non conosco altri modi alternativi all'ODBC!Se hai suggerimenti sono ben accetti.
    mercoledì 14 maggio 2014 13:25
  • puoi descrivere esattamente cosa hai sviluppato e con quale tecnologia ?

    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    lunedì 19 maggio 2014 07:58
    Moderatore
  • 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.
    martedì 20 maggio 2014 08:14
  • 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

    martedì 20 maggio 2014 13:17
    Moderatore
  • 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.
    martedì 20 maggio 2014 14:08
  • 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

    giovedì 22 maggio 2014 10:08
    Moderatore
  • Grazie delle risposte, so da ora che per effettuare operazioni complesse con SQL Server mi conviene usare Stored .
    giovedì 22 maggio 2014 13:57