発生している問題は、(ほぼ確実に)キャッシュされたクエリプランが原因です。これは、クエリに渡されるパラメータの一部のバージョンには適していますが、他のバージョンには適していません(別名パラメータスニッフィング)。
これはよくあることであり、古い統計やひどく断片化されたインデックスによって悪化することがよくあります。
最初のステップ :すべてのインデックスを再構築し、インデックスが作成されていない列の統計が最新であることを確認してください。 (また、クライアントに定期的にスケジュールされたインデックスメンテナンスジョブがあることを確認してください)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
これは標準的なリファレンスです。アプリケーションでは低速、SSMSでは高速ですか?
インデックスを再構築して統計を更新した後も問題が解決しない場合は、いくつかのオプションがあります。
-
動的SQLを使用します(ただし、最初にこれを読んでください:動的SQLの呪いと祝福)
-
OPTIMIZE FOR
を使用する -
WITH(RECOMPILE)
を使用する