Лучшая производительность с SQL и Java-программой - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть код, в котором я получаю данные из различных источников, сортирую и упорядочиваю их для отправки пользователю.

Я беру данные, запуская запрос, содержащий несколько соединений в список.из DTO, то снова я запускаю другой запрос, который дополнительно содержит несколько объединений в один и тот же список DTO.затем я добавляю оба списка DTO, которые должны быть представлены пользователю.

Запрос 1: Выбор * из TABLE1, TABLE2 ....

Запрос 2: Выберите * из TABLE5, TABLE7 ....

dto1.addAll(dto2);

dto1.sort(Comparator....);

Я снова сортирую его программно по следующей причине:

Query 1 returned sorted data lets assume
1,2,3,4
Query 2 returned sorted data lets assume
1,2,3,4

After combining both the lists, I will get
1,2,3,4,1,2,3,4
Expected data
1,1,2,2,3,3,4,4

Мой вопрос такой,в каком случае производительность будет лучше?

  1. извлечь отсортированные данные из обоих запросов, добавить список, а затем отсортировать и упорядочить их.
  2. извлечь несортированные данные из обоих запросов, добавьте список, а затем сортируйте и упорядочивайте только один раз.

В первом случае он будет отсортирован трижды, а во втором случае он будет отсортирован и упорядочен только один раз.

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

Так, в случае эффективности и производительности,какой из них следует порекомендовать?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

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

Но если вы извлекаете данные с отсортированным порядком, а затем снова запускаете алгоритм сортировки, то для его выполнения потребуются дополнительные затраты, хотя и незначительные.

0 голосов
/ 23 декабря 2018

Сделайте все это в MySQL:

( SELECT ... )
UNION ALL
( SELECT ... )
ORDER BY ...

Не беспокойтесь о сортировке в двух выборках;дождитесь конца, чтобы сделать это.

ALL предполагает, что нет никаких дураков, от которых нужно избавиться.

Этот подход может быть самым быстрым просто потому, что онэто один запрос SQL к базе данных.И потому что это делает только один вид.

0 голосов
/ 22 декабря 2018

Я думаю, что все три будут иметь одинаковую производительность.Вы могли бы получить немного более высокую скорость, используя одну или другую, но я не думаю, что она будет существенной.

Теперь, с точки зрения нагрузки, это другая история.Вы более ограничены ресурсами ЦП (на вашем локальном компьютере) или ресурсами базы данных (на удаленном сервере БД)?Большую часть времени база данных будет простаивать, в то время как ваше приложение будет обрабатывать много других вещей.Если это так, я бы предпочел поместить нагрузку на базу данных, а не на само приложение: то есть я бы позволил базе данных объединить и отсортировать данные в одном вызове SQL;тогда приложение просто будет использовать готовые данные.

Изменить 22 декабря. 2018:

Если оба запроса выполняются в одной базе данных, вы можетезапустите их как один и объедините результаты, используя CTE (Common Table Expression).Например:

with
x (col1, col2, col3, col4, ...) as (
  select * from TABLE1, TABLE2... -- query 1
  union all
  select * from TABLE5, TABLE7... -- query 2
)
select * from x
order by col1

ORDER BY в конце затем работает над объединенным результатом.В качестве альтернативы, если ваша база данных не поддерживает CTE, вы можете написать:

select * from (
  select * from TABLE1, TABLE2... -- query 1
  union all
  select * from TABLE5, TABLE7... -- query 2
) x
order by col1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...