在数据库表上运行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/

10-13 07:34
查看更多