我在数据库表上运行 sp_executesql 时遇到一些问题。在本例中,我使用 ORM (NHibernate) 生成一个查询一个表的 SQL 查询。该表大约有 700 万条记录,并且索引很高。
当我运行 ORM 在没有 sp_executesql 的情况下发出的查询时,它运行得非常快,并且探查器显示它有 85 次读取。当我使用 sp_executesql 运行相同的查询时,它有大约 201,828 次读取。
我需要在 SQL Server 上做些什么来提高在没有 sp_executesql 的情况下运行查询的性能吗?看起来好像它没有使用我的索引。
解决这个问题的最佳方法是什么?如果可能的话,我宁愿不改变 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”