sp_executesql вызывает очень медленный запрос - PullRequest
10 голосов
/ 11 сентября 2010

У меня проблемы с запуском 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'

1 Ответ

13 голосов
/ 11 сентября 2010

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

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

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

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