NHibernate + Oracle: проблемы со скоростью при запросе данных - PullRequest
2 голосов
/ 02 декабря 2010

У нас есть приложение WCF, которое использует NHibernate для запроса данных из базы данных. После установки приложения в новой тестовой среде мы сталкиваемся с некоторыми проблемами с производительностью запросов. В нашей старой и новой среде используются разные Oracle-серверы, но обе базы данных имеют одинаковые данные.

Мы просмотрели наши журналы NHibernate и определили проблемную часть:

2010-12-02 07:14:22,673 NHibernate.SQL                 - SELECT this_.CC...
2010-12-02 07:14:22,688 NHibernate.Loader.Loader       - processing result set
2010-12-02 07:14:27,235 NHibernate.Loader.Loader       - result set row: 0

В этом случае запрос вернул одну строку. Но, похоже, что в нашей новой среде «набор результатов обработки» занимает гораздо больше времени (5 секунд против 0,5 секунд), чем в нашей другой среде. Есть ли какой-нибудь способ точно узнать, что внутри «набора результатов обработки» занимает так много времени?

Примечание. Выполнение одного и того же точного запроса непосредственно в БД с помощью Toad не создает проблемы. С Toad оба сервера базы данных работают одинаково быстро.

Мы используем DetachedCriteria для создания запроса, а затем он выполняется следующим образом:

        Dim criteria As ICriteria = crit.GetExecutableCriteria(GetSession())
        Return New Generic.List(Of T)(criteria.List(Of T))

Версия NHibernate - 2.1.2.4, и мы используем ActiveRecord 2.1.0 для создания сопоставлений. Серверы Oracle имеют версию 10g.

Таким образом, в нашем случае у нас есть две среды, которые имеют одинаковую версию приложения с одинаковыми файлами конфигурации и выполняют запросы к идентичным базам данных, но которые имеют разные серверы приложений и оракулов. В одной среде запрос через NHibernate занимает около 5,5 секунд, а в другой - 0,5 секунды. Результаты являются согласованными, и один и тот же запрос был выполнен примерно 50 раз для обеих сред.

Есть ли в конфигурации Oracle что-то, что могло бы привести к неправильной работе с NHiberate? И есть ли способ получить более подробный выход из NHibernate, чтобы найти точную проблему в «наборе результатов обработки»?

Любой совет с благодарностью.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Мы смогли решить нашу проблему, переключив драйверы баз данных с Microsoft на Oracle ODP.net. Теперь оба сервера работают одинаково быстро, и даже наш ранее быстрый сервер выполняет запросы гораздо быстрее. Мы не знаем, какие настройки на нашем новом сервере сделали драйвер Oracle Microsoft таким медленным.

И похоже, что Microsoft в настоящее время рекомендует всем использовать что-то другое, кроме своих собственных драйверов Oracle. http://blogs.msdn.com/b/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx

1 голос
/ 05 декабря 2010

Выполните трассировку sql в обеих средах, добавив этот оператор в ваш сеанс:

alter session set timed_statistics = true;изменить сессионный набор max_dump_file_size = unlimited;события alter set session '10046 контекст имени трассы навсегда, уровень 8';

- ваш запрос идет сюда select * from mytable где x = 1;

события alter set set events '10046 name tracecontext off ';

затем используйте tkprof для проверки файла трассировки (обычно в user_dump_dest находится каталог с именем udump и tkprof outputfile.log inputtracefilename.trc)

тип tkprof

сам по себе, чтобы увидеть экран справки и параметры команды

Также

Убедитесь, что вы используете те же настройки в INIT.ORA для таких вещей, как CURSOR_SHARING =

вобе базы данных

...