Почему извлечение из postgresql с помощью Hibernate занимает очень много времени на AWS?

#postgresql #amazon-web-services #spring-boot

Вопрос:

У меня есть среда на AWS с приложением RDS Postgresql9.6 и приложением Spring Boot версии 1.1.7, запущенным на экземпляре EC2. Теперь я хочу извлечь около 10 000 записей из таблицы базы данных Postgresql, что занимает около 1 минуты. Если я сделаю это локально, то для извлечения сущностей потребуется около секунды. Я ожидал бы, что извлечение просто займет немного больше времени, чем локально, например, 2 или 3 секунды. На самом деле запрос занимает 1 минуту.

Чтобы определить, может быть, проблема вызвана плохим запросом, который я сделал explain analyze SELECT * FROM view_name where uuid ='4e663553-4271-4d7d-8de9-d7b746787cc6' , который говорит мне, что выполнение самого запроса просто занимает 300 мс. Поэтому я подумал, что проблема с производительностью возникает из-за передачи данных из БД в приложение. Но я не знаю, как это оценить или даже как это улучшить.

Чтобы воспроизвести это, я полагаю, вам нужна среда AWS с RDS и приложением, которое просто использует Hibernate для извлечения из RDS таблицы с примерно 10 000 записей.

ПРАВКА 1

Сохраняемость и конфигурация источника данных.

Мы используем режим гибернации и имеем следующую конфигурацию:

 hibernate.default_batch_fetch_size=8
hibernate.jdbc.fetch_size=10
hibernate.jdbc.batch_size=8
hibernate.cache.use_query_cache=true
hibernate.cache.use_second_level_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.redis.SingletonRedisRegionFactory
hibernate.cache.use_structured_entries=true
hibernate.max_fetch_depth=10
hibernate.transaction.factory_class=org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
 

Я также должен отметить, что мы используем ElastiCache Redis с версией 2.8.24.

Комментарии:

1. Этот запрос действительно выглядит очень специфичным (т. е. возвращает одну строку вместо 10000). Ваш локальный тест, вероятно, не содержит 10000 строк, не является удаленным (локальным на вашей машине разработки). Все эти данные необходимо передавать по сети, которая работает медленно. Он также делает это частями в зависимости от размера выборки (по умолчанию 10 для postgres), что приводит к 1000 обходам. Какой механизм сохранения вы используете JPA, JDBC или …? Пожалуйста, добавьте в свой вопрос конфигурацию источника данных (и сохраняемости).

2. Исключите spring boot из уравнения, выполнив запрос из psql (на той же машине, на которой выполняется spring-boot), и посмотрите, сколько времени это займет. Что-то вроде time psql -Ac 'select * from pgbench_accounts' >/dev/null

3. Запросы действительно заняли около 0,3 секунды. Так же, как я бы сделал это на локальной машине. Поэтому я бы предположил, что это скорее проблема с гибернацией?