在数据库表上运行sp_executesql时遇到一些问题。我使用的是ORM(NHibernate),在这种情况下,该ORM(NHibernate)会生成查询一个表的SQL查询。该表中大约有700万条记录,并且已被高度索引。
当我运行没有sp_executesql的ORM退出查询时,它运行非常快,分析器显示它具有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'
上下文是varchar(255)。此字段是非常自由的形式。它并不总是整数,长度可能非常大。在这种情况下,我要查询的值是“55”,但查询“Foooooobaaaarrr”也一样容易
最佳答案
。[Context]的数据类型是什么?使用相同的数据类型
现在您正在使用nvarchar(2),但是对于像55这样的东西来说似乎很奇怪,如果您使用的数据类型不同,则会得到转换,从而导致扫描
根据您更新的问题,它看起来像是varchar(255),然后执行此操作
WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55'
关于sql - sp_executesql导致我的查询非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3688015/