2015-12-09 8 views
6

Ho una situazione interessante. Quando eseguo una query sul server SQL remoto in Microsoft SQL Server Management Studio, viene eseguito rapidamente (12 secondi), ma quando eseguo la stessa query in Entity Framework utilizzando DbContext.Database.SqlQuery<EntityType>(script) occorrono 48 secondi.Prestazioni di lettura dati quadro Entità

Ho provato a impostare set arithabort on. L'impostazione è stata applicata ma non ha modificato le prestazioni. Non sono in grado di fornire piani di esecuzione delle query, poiché dispongo solo di autorizzazioni limitate sul server SQL. Ma posso dire al 100% che questo non è il problema della query.

Considerate questa query:

declare @t table (...) 
insert into @t 
select <long query> 

select top 1 * from @t 

La variabile @t contiene circa 35k righe. I tempi di esecuzione sono praticamente simili in EF e in SSMS. Ma quando rimuovo lo top 1 allora la cosa strana inizia ad accadere. In SSMS ottengo 10 sec, ma in EF circa 40 sec.

Immagino che questo piccolo esperimento possa escludere la possibilità che SQL Server scelga il piano di esecuzione sbagliato e rallenti le cose.

Un altro punto di interesse sarebbe la materializzazione dell'entità fatta da EF. Penso che anche questo non sia un collo di bottiglia, perché quando eseguo una query simile con un risultato di dimensioni simili impostato su un SQL Express locale, ottengo i risultati quasi istantaneamente in entrambi i casi.

Quindi la mia prossima ipotesi è problemi di rete. Ho installato Microsoft Network Monitor 3.4 e monitorato il traffico di rete sia per SSMS che per EF. La cosa interessante che ho scoperto è che per qualche ragione ci sono molti pacchetti di dimensioni più piccole e anche alcuni pacchetti TLS nella versione EF. Nella versione SSMS la dimensione del pacchetto è più stabile e non ci sono pacchetti TLS.

Quindi la domanda è: è possibile velocizzare la versione EF? Quali sono questi pacchetti TLS, è possibile sbarazzarsi di loro?

SSMS traffic EF traffic

Aggiornamento
Entity Framework V6.1.3
.NET v4.5.1
v10.50.2550.0 SQL Server
SQLExpress locale v12.0.4213.0
Windows 7 Pro

Aggiornamento

using (var connection = new SqlConnection(DbContext.Database.Connection.ConnectionString)) 
using (var cmd = new SqlCommand(script, connection)) 
{ 
    connection.Open(); 

    cmd.CommandType = CommandType.Text; 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     reader.Read(); 
     do 
     { 
     } while (reader.Read()); 
    } 
} 

Questo codice produce gli stessi risultati a tempo.

risposta

3

Ho fatto qualche ricerca e sperimentazione, e sembra che l'aggiunta dell'opzione packet size=32768 (questa è la dimensione massima) alla stringa di connessione tenda ad aumentare la velocità a quasi i livelli SSMS. È interessante notare che i pacchetti TCP che ricevo fanno non aumentano le loro dimensioni.

Ho sperimentato anche altre opzioni di stringhe di connessione ma non ho riscontrato alcun aumento notevole della velocità.

Problemi correlati