Подтвердить что ты не робот

Sp_executesql, в результате чего мой запрос будет очень медленным

У меня возникают некоторые проблемы при запуске sp_executesql в таблице базы данных. Я использую ORM (NHibernate), который генерирует SQL-запрос, который запрашивает одну таблицу в этом случае. В этой таблице содержится около 7 миллионов записей и сильно индексируется.

Когда я запускаю запрос, который ORM выплевывает без sp_executesql, он работает очень быстро, и профайлер показывает, что он имеет 85 просмотров. Когда я запускаю тот же запрос, используя sp_executesql, он имеет около 201 828 просмотров.

Есть ли что-то, что мне нужно сделать на моем SQL Server, чтобы повысить производительность выполнения запроса без sp_exectuesql? Кажется, что он не использует мои индексы.

Каков наилучший способ исправить эту проблему? Если возможно, я бы предпочел не изменить способ создания SQL-сервера ORM, но вместо этого устранить проблему на уровне SQL Server/database, потому что, похоже, проблема в этом. Я предполагаю, что мне нужно сделать больше оптимизации в базе данных, чтобы исправить эту проблему. Я просто не знаю, что.

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"

4b9b3361

Ответ 1

что такое тип данных. [Контекст] использует один и тот же тип данных

прямо сейчас вы используете nvarchar (2), но это кажется странным для чего-то вроде 55, если вы не используете одни и те же типы данных, вы получите конверсии, которые затем вызывают сканирование

на основе вашего обновленного вопроса, похоже, что это varchar (255), а затем сделайте это

WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55'