2010-09-10 15 views
10

Tengo algunos problemas al ejecutar sp_executesql en una tabla de base de datos. Estoy usando un ORM (NHibernate) que genera una consulta SQL que consulta una tabla en este caso. Esta tabla tiene alrededor de 7 millones de registros y está altamente indexada.sp_executesql que hace que mi consulta sea muy lenta

Cuando ejecuto la consulta que el ORM escupe sin el sp_executesql, se ejecuta muy rápido y profiler muestra que tiene 85 lecturas. Cuando ejecuto la misma consulta utilizando sp_executesql, tiene alrededor de 201.828 lecturas.

¿Hay algo que deba hacer en mi servidor SQL para mejorar el rendimiento de ejecutar la consulta sin sp_exectuesql? Parece como si no estuviera usando mis Índices.

¿Cuál es la mejor manera de solucionar este problema? Si es posible, preferiría no cambiar la forma en que el ORM está generando el SQL sino solucionar el problema en el nivel de SQL Server/base de datos porque parece que ahí es donde está el problema. Supongo que necesito hacer más optimización en la base de datos para solucionar este problema, simplemente no sé qué.

exec sp_executesql N'SELECT top 20 
          this_.Id as Id0_0_, 
          this_.Application as Applicat2_0_0_, 
          this_.[Context] as column3_0_0_, 
          this_.Logger as Logger0_0_, 
          this_.Message as Message0_0_, 
          this_.Exception as Exception0_0_, 
          this_.Thread as Thread0_0_, 
          this_.[Level] as column8_0_0_, 
          this_.LogDate as LogDate0_0_, 
          this_.SessionId as SessionId0_0_ 
         FROM LogMessages this_ 
         WHERE this_.[Context] = @p0', 
        N'@p0 nvarchar(2)', 
        @p0 = N'55' 

Contexto es un varchar (255). Este campo es de forma muy libre. No siempre es un número entero y la longitud puede muy. En este caso, yo estoy consultando por un valor de '55', pero podría fácilmente ser Consultando 'Foooooobaaaarrr'

+1

¿Qué versión de SQL Server? ¿Cómo se ve la consulta? –

+1

sin ver ningún código, solo podemos adivinar – SQLMenace

+0

SQL Server 2008 – Rob

Respuesta

13

¿cuál es el tipo de datos. [Contexto] usar el mismo tipo de datos

en este momento está usando nvarchar (2) pero parece extraño para algo así como 55, si no usa los mismos tipos de datos obtendrá conversiones que luego causan escaneos

según su pregunta actualizada, parece que es varchar (255), luego haz esto

WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55' 
+4

El "obtener conversiones que luego causan escaneos" es la respuesta que estaba buscando. Parece que por alguna razón, NHibernate está tratando de usar nvarchar y no varchar, lo que está causando el problema. Cambiarlo manualmente a varchar soluciona el problema. – Rob

+2

porque las cadenas en .NET son unicode y esto se transfiere a nvarchar – SQLMenace

Cuestiones relacionadas