У меня возникают проблемы при запуске sp_executesql в таблице базы данных. Я использую ORM (NHibernate), который генерирует SQL-запрос, который в этом случае запрашивает одну таблицу. Эта таблица содержит около 7 миллионов записей и хорошо индексируется.
Когда я запускаю запрос, который ORM выдаёт без sp_executesql, он выполняется очень быстро, и профилировщик показывает, что он имеет 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»