2009-03-19 15 views
6

ho interrogazione esecuzione ~ 2 sec a MSSMS (ritorno 25K di righe)rallentamento delle prestazioni di SqlDataReader

stessa query utilizzato in .NET (sqlReader) exetuting pochi minuti!

ho provato anche ad eseguire solo lettore

(commentato tutto il codice nel ciclo while solo di lasciare reader.Read()) - ancora lo stesso!

Qualche idea su cosa succede?

+0

Puoi pubblicare del codice? –

+0

Il profiler di query Sql rivela qualche suggerimento sul problema? –

+0

EJB: il codice non è stato pubblicato. Il problema è lo stesso anche se usiamo il comando di puro comando Execute (disponibile nell'aiuto di MS) – Maciej

risposta

2

Non sono DBA e non sono privilegiato per giocare con Profiler - chiederò al mio DBA e lo farò sapere a tutti.

Nel frattempo sto notato spinta essenziale delle prestazioni dopo aver aggiunto "WITH RECOMPILE" param alla SP Sto parlando

Quindi, dal mio punto di vista sembra essere il caso di piano di esecuzione ... Cosa ne pensi?

[EDIT] anche quello che ho controllato stava eseguendo sotto query dal QA e .NET

select @@options 

mia comprensione è essa ritornerà stesso valore per entrambi i environements. (Se non verrà utilizzato explendet) Ho ragione?

[EDIT2] ho letto (da http://www.sqldev.net/misc/fn_setopts.htm) che ARITHABOIRT = ON a QA (NET è spento)

Fa enybody sapere come forzare ARITHABOIRT = ON per ogni. Connessioni NET?

+3

@Maciej - È possibile impostare ARITHABORT ON eseguendo un comando con quel testo utilizzando l'oggetto Connection prima di chiamare ExecuteReader. L'opzione impostata sarà valida per la vita di quella connessione. –

+0

Lo stesso è appena successo a me. SP accecantemente veloce, la chiamata da .NET richiedeva per sempre. Ho aggiunto SET ARITHABORT = ON e tutto è diventato magicamente più veloce ... – abx78

0

Vorrei controllare per quanto tempo sta prendendo il recupero effettivo.

per esempio:

Private Sub timeCheck() 
    'NOTE: Assuming you have a sqlconnection object named conn 

    'Create stopwatch 
    Dim sw As New System.Diagnostics.Stopwatch 

    'Setup query 
    Dim com As New SqlClient.SqlCommand("QUERY GOES HERE", conn) 

    sw.Start() 

    'Run query 
    Dim dr As SqlClient.SqlDataReader = com.ExecuteReader() 

    sw.Stop() 

    'Check the time 
    Dim sql_query_time As String = CStr((sw.ElapsedMilliseconds/1000)) & " seconds" 
    End Sub 

questo vi permetterà di vedere se l'hold-up è in recupero, o nell'esecuzione del lettore.

0

Se si ar esecuzione il lettore in un ciclo, in cui viene eseguito molte volte, quindi assicurarsi che si sta utilizzando CommandBehavior.CloseConnection

SqlCommand cmd = new SqlCommand(); 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 

Se non lo fai, ogni volta che il ciclo elabora i linea, quando termina e l'rdr e l'oggetto di connessione escono dall'ambito, l'oggetto di connessione non verrà chiuso in modo esplicito, quindi verrà solo chiuso e rilasciato al pool quando Garbage Collector finalmente riuscirà a finalizzarlo ...

Quindi, se il loop è abbastanza veloce, (che è molto probabile), si esauriranno le connessioni. (Il pool ha un limite massimo che può generare)

Ciò causerà latenza e ritardi aggiuntivi poiché il codice continua a creare connessioni aggiuntive non necessarie (fino al massimo) e attende che il GC "rilevi" con il ciclo li sta utilizzando ...

+0

La domanda originale menziona solo l'esecuzione di una query che richiede anni, non c'è nulla sulla creazione di un sacco di oggetti SqlConnection e l'esecuzione di un sacco di query. – sisve

+5

amico, la query originale menziona un loop ... che succede con la gente su questo sito comunque? non è tua funzione identificare ogni minima cosa nelle risposte di altre persone. A meno che qualcuno non dica qualcosa di sbagliato, tieni i tuoi commenti su una nota positiva per favore. –

+0

Penso che Simon voglia dire che sarebbe bello se la risposta suggerita avesse qualcosa a che fare con la domanda originale. Ha ragione, la domanda originale non ha nulla a che fare con le connessioni, ha a che fare con il codice eseguito all'interno di un ciclo .Read(), il che significa che c'è solo una connessione. Quindi tecnicamente hai detto qualcosa di sbagliato, in quanto hai risposto a una domanda che non è stata posta. –

4

Vorrei impostare una traccia in SQL Server Profiler per vedere quali impostazioni delle opzioni SET la connessione sta utilizzando durante la connessione da codice .NET e quali impostazioni vengono utilizzate in SSMS. Con le impostazioni di opzioni SET, voglio dire

ARITHABORT 
ANSI_NULLS 
CONCAT_NULL_YIELDS_NULL 
//etc 

Date un'occhiata a MSDN per un tavolo di opzioni

ho visto il problema prima dove le opzioni erano diverse (in quel caso, ARITHABORT) e la differenza di prestazioni era enorme

0

Inoltre, l'analizzatore di query non scarica il contenuto completo del testo di grandi dimensioni o di grandi campi binari. Il tuo SqlDataReader potrebbe richiedere più tempo perché scarica il contenuto completo.

3

Ho avuto questo problema. Spuntare l'impostazione "aritmetica interruzione" nelle Impostazioni di connessione del server DB.

+0

Nel tuo caso hai aiutato a selezionare o deselezionare questa opzione? – Maciej

+0

Si desidera accenderlo in questo modo, 'MyCommand.CommnadText =" SET ARITHABORT ON; "+ MyCommand.CommnadText;' – JasonRShaver

Problemi correlati