Давайте предположим, что у меня есть таблица с полем типа VARCHAR. И я должен получить данные из той таблицы, отсортированной в алфавитном порядке по тому полю.
Что является лучшим способом (для производительности): добавить order by field
к SQL-запросу или виду данные, когда это уже выбирается?
Я использую Java (с, в спящем режиме), но я ничего не могу сказать о механизме DB. Это могла быть любая популярная реляционная база данных (как MySQL или SQL-сервер MS или Oracle или DB HSQL или любой другой).
Сумма записей в таблице может варьироваться значительно, но давайте предположим, что существуют записи 5k.
UPD: как хорошо 2-й уровень в спящем режиме кэш (EHCache, например) поддержка отсортированные данные?
Если это поле проиндексировано, то средняя БД будет намного эффективнее в этой задаче, чем Java. Также обратите внимание, что вы обычно не извлекаете все эти строки сразу, если это для чистого отображения, а скорее извлекаете его подмножество, чтобы его можно было отображать с помощью разбивки на страницы. Вы также можете сделать это на уровне БД. Сортировка данных в Java потребует, чтобы вся таблица была перенесена в память Java, вы же не хотите этого делать.
В Hibernate вы можете упорядочить результаты с помощью Criteria # addOrder ()
и разбить на страницы с помощью Criteria # setFirstResult ()
и Criteria # setMaxResults ()
. Например.
List users = session.createCriteria(User.class)
.addOrder(Order.asc("username"))
.setFirstResult(0) // Index of first row to be retrieved.
.setMaxResults(10) // Amount of rows to be retrieved.
.list();
Сортировка данных в базе данных - это (часть) того, для чего они нужны. Механизм базы данных, вероятно, лучше разбирает эти данные, чем вы.
Сортировка Pro в базе данных:
по
в запросе sql легче написать и поддерживать, чем компаратор Java. Профессиональная сортировка в приложении:
Как лучше (по производительности): добавить сортировку по полю в SQL-запрос или отсортировать данные, когда они уже получены?
Это ORDER BY
, не сортировать по.
Это вопрос компромисса: сортировка на стороне клиента распределена, что означает меньшее влияние на сервер. Однако для этого может потребоваться больше клиентских ресурсов.
Если поле не проиндексировано, чтобы вернуть весь отсортированный набор записей, серверу потребуется выполнить следующие действия:
, тогда как для сортировки на стороне клиента требуются только точки 1
и 3
(которые являются наименее ресурсоемкими).
Если ваш сервер должен обслуживать сотни клиентов одновременно, а вашим клиентам нужны целые наборы записей, то, скорее всего, сортировка на стороне клиента будет более эффективной.
Если поле проиндексировано, база данных может вернуть данные, уже отсортированные из этого индекса. Однако это потребует дополнительных поисков в таблице, чтобы получить другие поля.
Кроме того, если вам нужен не весь набор записей, а только некоторые верхние поля (например, в ORDER BY LIMIT
или SELECT TOP… ORDER BY
), весь набор записей не будет должны быть получены и переданы по сети. В этом случае заказ на стороне базы данных, вероятно, будет более эффективным.
Всего для 5 тысяч записей это не имеет особого значения, но я бы отсортировал его по базе данных; даже если в поле нет индекса, он, вероятно, будет по крайней мере так же быстро, как и после этого.
Моим решением было бы создать индекс для столбца сортировки и написать запрос с предложением order by.
, и даже если вы не (не можете) оптимизировать свою базу данных, вы должны (почти) всегда предпочитать оставлять такие операции на усмотрение b.e.