Как диагностировать проблемы с производительностью с помощью SQL Server Views и JDBC - PullRequest
1 голос
/ 06 октября 2010

В SQL Server 2008 определено представление, объединяющее 4 таблицы.Выполнение этого представления в SQL Server Management Studio занимает около 3 секунд и возвращает около 45 000 записей.Мое приложение написано на Java с использованием hibernate, чтобы просто выполнить запрос «из MyViewObject» в HQL.Когда это выполняется, время выполнения постоянно составляет около 45 секунд.Я также попытался просто использовать JDBC для выполнения этого запроса и получил тот же уровень производительности, поэтому я предположил, что он не имеет никакого отношения к hibernate.

Мой вопрос: что я могу сделать, чтобы диагностировать эту проблему?Очевидно, что то, как Management Studio выполняет запрос, отличается от того, как мое приложение выполняет запрос, но я не смог придумать много.

Единственное, что я придумал какпотенциально жизнеспособным объяснением является проблема с библиотекой jtds, которая содержит драйвер для SQL Server в Java.

Будем весьма благодарны за любые рекомендации.

ОБНОВЛЕНИЕ Я вернулсячтобы попробовать чистый JDBC и попытался добавить атрибуты selectMethod и responseBuffering в строку подключения, но не получил никаких улучшений.Я также взял свой код JDBC из своего приложения и запустил его из тестовой программы, содержащей только мой код JDBC, и он запустился в течение ожидаемых 3 секунд.Так что для меня это кажется экологичным для приложения.

Мое приложение - приложение на основе Google Web Toolkit (GWT), и код JDBC выполняется в моем основном сервлете RPC.По сути, метод RPC получает вызов и немедленно выполняет код JDBC.Ничто в этой настройке не дает мне много указаний на то, почему производительность ужасна.Я собираюсь попробовать драйвер JDBC 3.0 и посмотреть, будет ли он работать лучше, но, похоже, это еще не решит проблему.

Моя цель на данный момент - получить мой запросработать вживую с JDBC, а затем переключить его обратно в Hibernate, чтобы я мог сделать тестирование достаточно простым.Спасибо за помощь до сих пор!

ОБНОВЛЕНИЕ 2 Я наконец начинаю сосредотачиваться на источнике проблемы, хотя все еще не знаю, какова реальная проблема.Я открыл представление в SQL Server и скопировал оператор SQL (довольно большой) точно в мой код и выполнил его, используя JDBC, вместо того, чтобы извлекать данные из представления, и большинство проблем производительности исчезли.Кажется, что некоторая комбинация GWT, SQL Server Views и JDBC здесь не работает должным образом.Я не рассматриваю сохранение очень большого рукописного запроса в своем коде как долгосрочное решение, но оно предлагает немного больше понимания.

Ответы [ 2 ]

2 голосов
/ 06 октября 2010
<property name="hibernate.show_sql">true</property>

установка этого параметра покажет вам запрос SQL, сгенерированный hibernate.Проанализируйте запрос и убедитесь, что вы не пропустили связь.

ответ для Обновления 1 и 2: Как вы упоминали, запустил запрос по вашему запросу sql, и кажется, что он быстрый.Еще одна вещь, о которой следует помнить в hibernate, - это то, что он создает объект, возвращаемый вашим запросом (конечно, это зависит от того, инициализируете ли вы объект lazy. Не помню, как он называется).Сколько объектов возвращает ваш запрос?также вы можете выполнить простую проверку того, в чем проблема.

Например, перед выполнением запроса выполните sysout текущего времени, а затем sysout текущего времени после.сделайте это для всех тех мест, которые, по вашему мнению, замедляют работу приложения.

1 голос
/ 06 октября 2010

Чтобы проанализировать проблему, вам следует поискать в вашем руководстве инструменты, отображающие запрос или план выполнения . Возможно, вам не хватает индекса для столбца соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...