Один хороший момент из проекта сегодня:
Я искал около недели, потому что мой запрос nHibernate (многокритериальный, использующий фьючерсы для загрузки некоторых коллекций) занял 11 секунд (продолжительность в MSSQL профилировщике) и около 2 секунд, если я выполняю точно такой же комбинированный запрос в SSMS.
Решение было так: у меня было активировано ведение журнала для запуска профилировщика Ayendes. NHProf dll, где отсутствует, но: Некоторые методы GetRows в вызовах журнала триггеров nHibernate во время гидратации. И разница была: 9 секунд!
Я только что закомментировал вызов конфигурации log4net, и задержка почти прошла.
У меня было около 14.000 экземпляров плюс 60.000 записей коллекции HasMany. Гидратация теперь занимает 0,6 секунды, поскольку оператор SQL занимает 2 секунды (это еще одна история оптимизации).
И: я думаю, что продолжительность гидратации вместе с продолжительностью выполнения запроса показана в столбце «продолжительность» профилировщика SQL.
Еще одна история, произошедшая 2 недели назад: «Планы выполнения в профилировщике SQL отличались от планов выполнения при выполнении запроса в SSMS. Причиной этого было то, что я использовал провайдера OLEDB в nHibernate. Я переключился на соединения ADO, и план выполнения был таким же. Я нашел это, глядя на какой-то столбец «версия протокола» в MS SQL profiler.
Существует множество причин для ловушек производительности помимо n + 1:)
С наилучшими пожеланиями!
Майкл