2009-03-19 22 views
6

He ejecución de consulta ~ 2 segundos en MSSMs (volviendo 25K de filas)rendimiento lento de SqlDataReader

misma consulta se utiliza en .NET (sqlReader) exetuting pocos minutos!

También he intentado ejecutar único lector

(comentado todo el código en el bucle while simplemente dejando reader.Read()) - Todavía mismo!

¿Alguna idea de qué pasa?

+0

¿Se puede publicar algún código? –

+0

¿El analizador de consultas Sql revela alguna pista sobre el problema? –

+0

EJB: código no es necesario para publicar. El problema es el mismo incluso si usamos el comando de ejecución puro del lector (disponible en la ayuda de MS) – Maciej

Respuesta

2

No soy DBA y no tengo el privilegio de jugar con Profiler. Preguntaré a mi DBA y lo sabré.

Mientras tanto estoy notado impulso esencial rendimiento después de la adición de "CON RECOMPILE" parámetro a SP Estoy hablando

Por lo tanto, desde mi punto de vista, parece ser el caso con el plan de ejecución ... ¿Qué opinas?

[EDIT] también lo he comprobado estaba actuando por debajo de consulta de control de calidad y .NET

select @@options 

Mi entendimiento es que volverá mismo valor para ambos environements. (De lo contrario, se usarán los ex. Planes de differnet) ¿Estoy en lo correcto?

[Edit2] he leído (de http://www.sqldev.net/misc/fn_setopts.htm) que ARITHABOIRT = ON en control de calidad (en .NET se va)

Hace enybody saber cómo forzar ARITHABOIRT = ON para todos. Conexiones de red?

+3

@Maciej: puede CONFIGURAR ARITHABORT activando un comando con ese texto utilizando su objeto Connection antes de llamar a ExecuteReader. La opción de establecer estará vigente durante toda la vida de esa conexión. –

+0

Lo mismo me pasó a mí. SP que cegaba rápidamente, la llamada de .NET tardaba una eternidad. He agregado SET ARITHABORT = ON y todo se volvió mágicamente más rápido ... – abx78

0

Revisaré para ver cuánto tiempo está tomando la recuperación real.

por ejemplo:

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 

Esto le permitirá ver si el atraco se encuentra en la recuperación o en la ejecución del lector.

0

Si ar ejecutar el lector en un bucle, donde se ejecuta muchas veces, y luego asegurarse de que está utilizando CommandBehavior.CloseConnection

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

Si no, cada vez que el bucle de la línea de procesos, cuando termina y el rdr y el objeto de conexión quedan fuera del alcance, el objeto de conexión no se cerrará explícitamente, por lo que solo se cerrará y se devolverá al grupo cuando el recolector de basura finalmente llegue a finalizarlo ...

Entonces, si su ciclo es lo suficientemente rápido, (lo cual es muy probable), se le acabarán las conexiones. (El grupo tiene un límite máximo que puede generar)

Esto causará latencia y retrasos adicionales ya que el código sigue creando conexiones adicionales innecesarias (hasta el máximo) y esperando que el GC "alcance" el ciclo que los está usando ...

+0

La pregunta original solo menciona la ejecución de una consulta que demora años, no hay nada sobre la creación de muchos objetos SqlConnection y la ejecución de muchas consultas. – sisve

+5

amigo, la consulta original menciona un ciclo ... ¿qué pasa con la gente en este sitio de todos modos? no es su función identificar cada detalle menor en las respuestas de otras personas. A menos que alguien diga algo incorrecto, mantenga sus comentarios en una nota positiva, por favor. –

+0

Creo que lo que Simon quiere decir es que sería bueno que la respuesta sugerida tuviera algo que ver con la pregunta original. Tiene razón, la pregunta original no tiene nada que ver con las conexiones, tiene que ver con el código ejecutado dentro de un bucle .Read(), lo que significa que solo hay una conexión. Entonces, técnicamente, dijiste algo mal, porque respondiste una pregunta que no se hizo. –

4

Configuraría un rastreo en el Analizador de SQL Server para ver qué configuración de opciones de SET está usando la conexión cuando se conecta desde el código .NET, y qué configuración se usa en SSMS. Por la configuración de las opciones SET, quiero decir

ARITHABORT 
ANSI_NULLS 
CONCAT_NULL_YIELDS_NULL 
//etc 

Tome un vistazo a MSDN para una tabla de opciones

he visto el problema antes, donde las opciones eran diferentes (en este caso, ARITHABORT) y la diferencia de rendimiento fue enorme

0

Además, el analizador de consultas no descarga el contenido completo del texto grande ni de los grandes campos binarios. Su SqlDataReader podría tomar más tiempo porque descarga los contenidos completos.

3

Tuve ese problema. Marque la opción "abortar aritmética" en la Configuración de conexión del servidor de BD.

+0

¿En su caso ayudó a marcar o desmarcar esta opción? – Maciej

+0

Quiere activarlo de esta forma, 'MyCommand.CommnadText =" SET ARITHABORT ON; "+ MyCommand.CommnadText;' – JasonRShaver

Cuestiones relacionadas