Мы только что создали новую виртуальную машину Hyper-V для размещения приложения Java и сервера Microsoft SQL. Мы столкнулись с очень медленными ответами из базы данных при запуске SQL запросов на выборку из приложения Java JDB C. Те же самые запросы выполняются быстро при запуске из SQL Server Management Studio.
Мы запустили одни и те же Java приложения и SQL Серверные базы данных на голом железе и на виртуальных машинах VMware без каких-либо проблем с производительностью.
Наши вопросы:
- Видели ли другие разработчики аналогичные проблемы с производительностью в виртуальной машине Hyper-V?
- Как мы можем диагностировать причины узкого места в производительности для приложения JDB C?
Пример запроса:
select * from view1 where app_id in (
select app_id from app_table where app_id % 1000 = 0)
order by app_id
Время отклика:
- SQL Сервер: 45 тыс. строк от 9 до 36 секунд, в зависимости от ОЗУ, процессоров и т. Д. c
- Java приложение: более 4 часов
виртуальная машина Hyper-V
- Windows Сервер 2019 хоста
- Конфигурация Hyper-V 9, поколение 2
Таблица app_table содержит только два столбца.
create table app_table (
app_id [numeric](18,0) not null,
col_2 [varchar] (75)
)
Представление app_view: также просто.
create view app_view as select app_id from app_table
Мы пробовали различные комбинации Java приложений катионы, драйверы JDB C и SQL Сервер.
Приложения:
- Наше пользовательское Java приложение
- Клиент SQuirreL (4.0.0)
JDB C драйверы:
- sqljdbc4
- sqljdbc_8.2.0.jre
SQL Версии сервера:
- SQL Сервер 2017
- SQL Сервер 2019
Java версия: 8_241
РЕДАКТИРОВАТЬ: SQL Результаты Profiler
Я не уверен, что лучший способ сообщить SQL результаты профилирования, поэтому я просто подведу итоги, что SQL Profiler сообщает. Клиент SSMS выполняет запрос представления за 23 секунды. Клиенту JDB C потребовалось более 100 секунд, прежде чем запрос был отменен до его завершения.
Для клиента SSMS
SQL: BatchStarting"select * from app_view where ..." 2020-02-26 20: 04: 22 * 1074 * <куча повторяющихся вещей>
Аудит входа / выхода из системы
RP C: Завершено "exe c sp_reset_connection"
BatchStarting / Completed "УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ ЧИТАТЬ ..."
</ конец группы повторяющихся вещей> **SQL: BatchCompleted "выберите * из app_view где ..." 2020-02-26 20:04:45
для клиента JDB C (SQuirreL)
SQL: BatchStarting"select * from app_view where ..." 2020-02-26 19: 55: 39
<куча повторяющихся вещей>
Audit Login / Выход из системы
RP C: Завершено "exe c sp_reset_connection"
BatchStarting / Завершено "УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ ЧИТАТЬ ..." *
</ конец группы повторяющихся вещей>
Запрос отменен в 19: 57: 26
РЕДАКТИРОВАТЬ 2: Больше SQL Результаты профилировщика
Я профилировал более простой запрос "выберите top 5000 a.app_id из app_table а в SSMS и клиенте JDB C. Удивительно, но оба выполняются быстро, менее чем за 1 секунду.
Для клиента SSMS
SQL: BatchStarting"top 5000 a.app_id из app_table a" 2020 -02-27 10: 27: 55.740
SQL: BatchCompleted"top 5000 a.app_id из app_table a" 2020-02-27 10: 27: 55.810
Для клиент JDB C (SQuirreL)
SQL: BatchStarting"top 5000 a.app_id из app_table a" 2020-02-27 10: 25: 45.063
SQL: BatchCompleted"top 5000 a.app_id из app_table a" 2020-02-27 10: 25: 45.843