Java 8 Entity List Entity занимает слишком много времени для обработки запроса - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть таблица в PostgreSQL «items», и там у меня есть некоторая информация, такая как id, name, desc, config и т. Д. Она содержит 1,6 миллиона записей.Мне нужно сделать запрос, чтобы получить все результаты, такие как «выбрать идентификатор, имя, описание из элементов» Каков правильный шаблон для итерации по большим наборам результатов?

Я использовал EntityListIterator:

EntityListIterator  iterator = EntityQuery.use(delegator)
                    .select("id", "name", "description")
                    .from("items")
                    .cursorScrollInsensitive()
                    .queryIterator();



 int total =  iterator.getResultsSizeAfterPartialList();
 List<GenericValue> items = iterator.getPartialList(start+1, length);
 iterator.close();

start здесь 0, а length равно 10.

Я реализовал это, чтобы сделать нумерацию страниц с таблицами данных.

Проблемаэто то, что у меня есть миллионы записей, и на это уходит около 20 секунд.Что я могу сделать, чтобы улучшить производительность?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

А как насчет CopyManager ? Вы можете получить свои данные в виде выходного потока text / csv, возможно, таким способом будет быстрее получить данные.

CopyManager cm = new CopyManager((BaseConnection) conn);
String sql = "COPY (SELECT id, name, description FROM items) TO STDOUT WITH DELIMITER ';'";
cm.copyOut(sql, new BufferedWriter(new FileWriter("C:/export_transaction.csv")));
0 голосов
/ 13 сентября 2018

Если вы реализуете нумерацию страниц, не следует загружать все 1,6 миллиона записей в память одновременно.Используйте order by id в своем запросе и id от 0 до 10, от 10 до 20 и т. Д. В предложении where.Держите счетчик, который обозначает, до какого id вы прошли.

Если вы действительно хотите извлечь все записи из памяти, просто загрузите записи первых нескольких страниц (например, из id = 1 в id =100), верните его клиенту, а затем используйте что-то вроде CompletableFuture для асинхронного извлечения остальных записей в фоновом режиме.

Другой подход заключается в запуске нескольких небольших запросов в отдельных потоках, в зависимости от того, какмногие параллельные операции чтения поддерживаются вашей базой данных, а затем объединяются результаты.

...