2010-07-16 1 views
3

Я делаю простой запрос в базе данных, поиск по двум столбцам. У меня есть индекс в столбцах. Когда я выполняю поиск в SQL Server Management Studio, требуется всего несколько миллисекунд (всегда меньше 10). Когда я делаю тот же запрос в NHibernate, он занимает более 30 секунд. Я профилировал запрос, и сгенерированный SQL в порядке. Я использую NHibernate Profiler, и когда я выбираю «показать результаты запроса» в NHibernate Profiler, для получения результатов требуется меньше секунды. Куда я отсюда отлажу эту отладку?Как отлаживать медленный NHibernate Выберите запрос?

EDIT: Итак, я решил сделать это с помощью session.CreateSQLQuery(), и он работает очень быстро. Почему это будет быстрее, чем другой метод?

EDIT: Кажется, что использование параметров запроса является проблемой. Я создал запрос HQL без параметров, и все было нормально. Как только я добавил именованные параметры, время выполнения запроса резко возросло.

ТАБЛИЦА SCHEMA:

CREATE TABLE [dbo].[CRDefendant](
[Id] [int] NOT NULL, 
[FirstName] [varchar](30) NULL, 
[LastName] [varchar](30) NULL, 
[MiddleName] [varchar](30) NULL, 
[Race] [char](1) NULL, 
[Sex] [char](1) NULL, 
[BirthDate] [char](10) NULL, 
[Social] [int] NULL, 
[BadData] [varchar](50) NULL, 
CONSTRAINT [PK__CRDefend__3214EC073B95D2F1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [GROUP3] 
) ON [GROUP3] 

GO 

QUERY:

SELECT this_.Id as Id16_0_, this_.FirstName as FirstName16_0_, this_.LastName as LastName16_0_, this_.MiddleName as MiddleName16_0_, this_.Race as Race16_0_, this_.Sex as Sex16_0_, this_.BirthDate as BirthDate16_0_, this_.Social as Social16_0_, this_.BadData as BadData16_0_ FROM [CRDefendant] this_ WHERE this_.LastName = @p0 and this_.FirstName like @p1 

ИНДЕКС:

CREATE INDEX IX_CRDefendant_Name_DOB 
ON CRDefendant (LastName ASC, FirstName ASC, BirthDate ASC) 
INCLUDE (MiddleName, Race, Sex, Social) 
ON GROUP3 

ответ

4

Для начала размещать точный запрос, показанный профилировщиком и запрос запускается в SSMS. Не обижайтесь, но то, что выглядит «отлично» для вас, может открыть обширную информацию обученному глазу. Во-вторых, укажите точную схему ваших таблиц, включая все индексы.

Пример возможной проблемы может быть NVARCHAR принуждения в связи с datatype precedence (поиск предикат с nvarchar @variable на varchar индекс результатов в полное сканирование).

Что касается более общего вопроса, Как подойти к такой проблеме, ответ: примените метод, подобный Waits and Queues. Вся необходимая информация доступна в различных DMV, таких как sys.dm_exec_query_stats, sys.dm_exec_requests, sys.dm_db_index_usage_stats. В плане исполнения также много говорится о том, что происходит, но значительно сложнее правильно интерпретировать информацию в плане выполнения.

+0

Ну, я запустить именно запрос, показанный в профилировщике SSMS, и он выполняет идентично моему рукописному запросу. –

+0

Я редактировал вопрос с дополнительной информацией о параметрах запроса. –

+1

Запрос, как показано профилировщиком, схемой таблицы и индексом –

-1

Как вы создаете свой запрос с помощью HQL или рамки критериев?

У меня была такая же ситуация. Запуск SQL spit из профайлера Nhibernate был быстрым, но приложение работало очень медленно. Исправлена ​​проблема переключения из структуры критериев в HQL.

Я думаю, что есть ошибка/особенность структуры критериев, которая делает ее очень медленной в некоторых обстоятельствах.

+0

Каковы эти обстоятельства? – mynkow

+0

У меня было это в разных. Я никогда точно не определял, что именно вызывает это. Просто говорю, что у меня была такая же проблема, как и у ОП, и это исправило это. Проще попробовать. – Alistair

1

Как и ответ Ремуса (который обращается к идиотское лечение (п) VARCHAR по NHibernate), я хотел бы добавить столбец BadData к INCLUDE пункта слишком

Смежные вопросы