2017-02-02 5 views
1

アプリケーションでパフォーマンスの問題が発生しています。
問題を引き起こしているというクエリを分離しました。パラメトリッククエリです。 クエリこのクエリは、テーブルMovimentiのテーブルスキャンをもたらす(NHibernateの生成)このクエリSQL Server(2016)パラメトリッククエリでインデックスを使用していません

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

あります。
Movimenti.IDContoは、インデックスが使用される。このよう

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

にクエリを変更するVARCHAR(15)

あります。

私は、クエリの最後に

option (optimize for unknown) 

option (optimize for (@p8 unknown)) 

を挿入するようにしようと試みたが、彼らは結果を変えませんでした。
解決策はありますか?

+0

インデックスと近似行数と共にテーブル定義を投稿できますか? –

答えて

1

OPTIMIZE FOR (@p8 = 'AT%')を使用すると、SQL Serverはこのパターンを使用してインデックスを使用する/使用する必要があると判断します。 %で始まらないLIKE条件では、索引を使用できます。

詳細情報については、
https://www.mssqltips.com/sqlservertip/1354/optimize-parameter-driven-queries-with-sql-server-optimize-for-hint/

NHibernateがそのヒントを提供できるかどうかわかりませんが、私は知りません。

+0

これは、ありがとう!今、問題はNHibernateでこれを注入する方法です – bubi

+0

あなたは[インターセプタ](http://nhibernate.info/doc/nhibernate-reference/events.html)を使ってこれを行うことができます。 'EmptyInterceptor'から派生し、' OnPrepareStatement'をオーバーライドし、修正されたSQL文を返します。セッションを開くときにセッションに挿入するか、グローバルに設定します。 –

0

、動的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 
0

私はこのことを確認することはできませんが、することができます!あなたの2番目のクエリはsargableですが、最初のものはそうではないかもしれませんが、これをやってみてください

WHERE (IDConto LIKE @p8 + '%') 
関連する問題