sp_executesql导致我的查询非常慢

Rob*_*Rob 10 sql t-sql sql-server nhibernate sql-server-2008

我在数据库表上运行sp_executesql时遇到一些问题.我正在使用ORM(NHibernate)生成一个SQL查询,在这种情况下查询一个表.该表中包含大约700万条记录,并且具有高度索引.

当我运行ORM吐出而没有sp_executesql的查询时,它运行得非常快,并且分析器显示它有85个读取.当我使用sp_executesql运行相同的查询时,它有大约201,828次读取.

我是否需要在SQL Server上执行某些操作以提高不使用sp_exectuesql运行查询的性能?好像它没有使用我的索引.

解决此问题的最佳方法是什么?如果可能的话,我宁愿不改变ORM生成SQL的方式,而是在SQL Server /数据库级别修复问题,因为它似乎就是问题所在.我猜我需要在数据库上做更多优化来解决这个问题我只是不知道是什么.

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'
Run Code Online (Sandbox Code Playgroud)

Context是varchar(255).这个领域是非常自由的形式.它并不总是一个整数,长度可能非常大.在这种情况下,我查询的值为'55',但它可以很容易地查询'Foooooobaaaarrr'

SQL*_*ace 13

什么是数据类型.[Context]使用相同的数据类型

现在你正在使用nvarchar(2),但对于像55这样的东西来说这似乎很奇怪,如果你没有使用相同的数据类型,你会得到转换然后导致扫描

根据您更新的问题,它看起来像是varchar(255),然后执行此操作

WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55'
Run Code Online (Sandbox Code Playgroud)

  • "获得转换然后导致扫描"是我正在寻找的答案.似乎由于某种原因,NHibernate试图使用nvarchar而不是varchar导致问题.手动将其更改为varchar可以解决问题. (4认同)
  • 因为.NET中的字符串是unicode,并且它被转移到nvarchar (2认同)