SQL Server(2016)未将索引用于参数化查询

SQL Server(2016)未将索引用于参数化查询,sql,sql-server,nhibernate,sql-server-2016,Sql,Sql Server,Nhibernate,Sql Server 2016,我在应用程序中遇到性能问题。 我隔离了导致问题的查询,它是一个参数查询。 查询就是这个查询(由NHibernate生成) 此查询导致表Movimenti的表扫描。 Movimenti.IDConto是一个varchar(15) 以这种方式更改查询 declare @p8 as varchar(4000); set @p8 = 'AT0703%'; SELECT sum(Movimenti.Importo) FROM Movimenti WHERE (IDConto LIKE 'AT0703%')

我在应用程序中遇到性能问题。
我隔离了导致问题的查询,它是一个参数查询。 查询就是这个查询(由NHibernate生成)

此查询导致表Movimenti的表扫描。
Movimenti.IDConto是一个varchar(15)

以这种方式更改查询

declare @p8 as varchar(4000);
set @p8 = 'AT0703%';
SELECT sum(Movimenti.Importo)
FROM Movimenti
WHERE (IDConto LIKE 'AT0703%')
使用索引

我试着插入

option (optimize for unknown)

在查询结束时,但他们没有更改结果。
有什么解决方案吗?

使用
优化(@p8='AT%')
这样SQL Server将使用示例模式来决定是否可以/应该使用索引。不以
%
开头的类似条件可以使用索引

有关更深入的信息,例如,请参阅本文:

但是,我不知道您是否可以让NHibernate提供该提示。

使用动态SQL:

declare @p8 as varchar(4000);
declare @sql as nvarchar(500)
set @p8 = 'AT0703%';
set @sql= 'SELECT sum(Movimenti.Importo)
FROM Movimenti
WHERE (IDConto LIKE ''' + @p8 + ''')'
exec sp_executesql @sql

我不能证实这一点,但你可以!您的第二个查询是sargable,而您的第一个查询可能不是,请尝试这样做

WHERE (IDConto LIKE @p8 + '%')

您可以发布表定义以及索引和近似行数吗?这很有效,谢谢!现在的问题是如何将其注入到NHibernate中,您可以使用。从
EmptyInterceptor
派生,重写
OnPrepareStatement
并返回修改后的SQL语句。在打开会话时将其注入会话,或全局配置会话。
declare @p8 as varchar(4000);
declare @sql as nvarchar(500)
set @p8 = 'AT0703%';
set @sql= 'SELECT sum(Movimenti.Importo)
FROM Movimenti
WHERE (IDConto LIKE ''' + @p8 + ''')'
exec sp_executesql @sql
WHERE (IDConto LIKE @p8 + '%')