Скорость SQL-запросов: несколько запросов против сортировки в Java

Допустим, у меня есть таблица с двумя столбцами:

  1. город
  2. имя (человека).

У меня также есть объект "город" Java, который содержит:

  1. название города
  2. список всех людей в этом городе

Итак, теперь у меня есть два варианта получения данных:

  1. Сначала используйте DISTINCT, чтобы получить список всех городов. Затем для каждого города снова запросите базу данных, используя WHERE, чтобы получить только записи о том, где человек живет в этом городе. Затем я могу сохранить это в объекте City.
  2. Получите список всех данных, используя ORDER BY для упорядочения по названию города. Затем прокрутите все записи и начните сохранять их в объектах City. Когда я обнаруживаю, что название города изменилось, я могу создать новый объект City и сохранить в нем записи.

Какой из этих методов быстрее/лучше на практике? Или есть лучший способ получить эту информацию, чем эти два метода? Я использую базу данных Oracle.


person user30189    schedule 26.07.2018    source источник
comment
Вы смешиваете здесь ORM и необработанный SQL, и я не могу понять ваш вопрос. Что именно вы пытаетесь сделать?   -  person Tim Biegeleisen    schedule 26.07.2018
comment
Во-первых, я бы порекомендовал делать такие вещи с помощью SQL, но зачем вам делать несколько запросов, чтобы получить свои результаты? Кажется возможным с одним запросом   -  person Henkan    schedule 26.07.2018
comment
Однозначно №2. Обратите внимание, что вы можете использовать Map в коде Java, устраняя необходимость в ORDER BY.   -  person Andreas    schedule 26.07.2018
comment
@Henkan В вопросе указаны DISTINCT, WHERE и ORDER BY, что указывает на то, что вопрос касается SQL, поэтому фраза Я бы рекомендовал делать подобные вещи с помощью SQL является излишним. --- Кроме того, OP уже говорит о решении с 1 запросом в № 2, поэтому утверждение Кажется возможным с одним запросом является излишним. --- Ваш комментарий излишен и даже не пытается ответить на вопрос: что лучше?   -  person Andreas    schedule 26.07.2018
comment
@Andreas Андреас, я думаю, мой комментарий был неясен: я знаю, что он будет использовать SQL, я просто имел в виду, что для меня, если это возможно, конечно, сделать запрос, который возвращает точный желаемый результат, лучше, чем получить некоторые данные, а затем обработать эти данные в код. Вот почему я рекомендую SQL.   -  person Henkan    schedule 26.07.2018
comment
@Henkan Не следую за тобой. Вопрос о загрузке данных в программу на Java, поэтому это невозможно сделать только в SQL. Требуется некоторая обработка для загрузки данных в List<City> с class City { String name; List<String> personNames; } (или аналогичным).   -  person Andreas    schedule 26.07.2018


Ответы (3)


Запрос к базе данных является относительно дорогостоящей операцией — вам нужно связаться с другим сервером по сети, затем ему может потребоваться доступ к своему диску, вычисление результата, возврат его вам и т. д. Вы хотели бы свести их к минимуму настолько, насколько возможный. Иметь один запрос и просматривать его результаты — это гораздо лучшая идея, чем иметь несколько запросов, если только у вас нет какой-то убийственной причины не делать этого — что здесь, похоже, не так, по крайней мере, из информации, которой вы поделились. .

person Mureinik    schedule 26.07.2018

Сортировать ответ № 2. Вы хотите делать как можно меньше запросов к базе данных. # 2, если я правильно понял, вы сделаете соединение города/людей, а затем создадите объект.

Лучший способ: используйте JPA/Hibernate. то есть проверьте http://www.baeldung.com/hibernate-one-to-many< /а>

person Alexandros    schedule 26.07.2018
comment
JPA/Hibernate не лучший способ. - person Andreas; 26.07.2018
comment
Это мнение, я бы предположил. Я думаю, что это. Можете ли вы объяснить, почему это не так? - person Alexandros; 26.07.2018
comment
Потому что добавление JPA/Hibernate только для проблемы, описанной в вопросе, является излишним. --- Кроме того, я не считаю, что определение отображения CREATE TABLE city_person ( city_name VARCHAR(50), person_name VARCHAR(50) ) в List<City> с class City { String name; List<String> personNames; } является таким прямым. - person Andreas; 26.07.2018
comment
Ключевые слова здесь «вы верите» и «вы не верите». На мой взгляд, для современных java-проектов лучше всего следовать JPA, потому что я предполагаю, что приложение не будет просто иметь две сущности. Следование подходу к карте, о котором вы упомянули, может вскоре привести его к необходимости использовать пользовательские компараторы и сортировщики, поскольку сравнение строк в java будет сделано лексикографией. Также по мере роста его данных ему может понадобиться разбиение на страницы. Я твердо верю, что вы согласны с тем, что JPA является улучшением для современных приложений, тем более что в конце дня он хочет иметь java pojos. - person Alexandros; 26.07.2018

Ответ №2 оптимален во всех случаях.

Вам нужно будет закодировать логику на Java, чтобы различать, когда вы переходите из одного города в другой.

В качестве альтернативы, если вы использовали MyBatis, решение становится очень простым с использованием «коллекций». Они выполняют одиночный вызов базы данных и извлекают все указанное вами дерево Java, включая все подсписки на нескольких уровнях. Очень производительный, а также простой в кодировании.

person The Impaler    schedule 26.07.2018