За и против сортировки данных в DB?

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

Что является лучшим способом (для производительности): добавить order by field к SQL-запросу или виду данные, когда это уже выбирается?

Я использую Java (с, в спящем режиме), но я ничего не могу сказать о механизме DB. Это могла быть любая популярная реляционная база данных (как MySQL или SQL-сервер MS или Oracle или DB HSQL или любой другой).

Сумма записей в таблице может варьироваться значительно, но давайте предположим, что существуют записи 5k.

UPD: как хорошо 2-й уровень в спящем режиме кэш (EHCache, например) поддержка отсортированные данные?

9
задан Roman 17 May 2010 в 11:50
поделиться

7 ответов

Если это поле проиндексировано, то средняя БД будет намного эффективнее в этой задаче, чем 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();
9
ответ дан 4 December 2019 в 12:17
поделиться

Сортировка данных в базе данных - это (часть) того, для чего они нужны. Механизм базы данных, вероятно, лучше разбирает эти данные, чем вы.

5
ответ дан 4 December 2019 в 12:17
поделиться

Сортировка Pro в базе данных:

  1. Скорость. Если у вас есть индекс в порядке по условию, базы данных вообще не должны сортировать, а для максимальной производительности вы можете использовать кластерный индекс.
  2. Простота использования. Порядок по в запросе sql легче написать и поддерживать, чем компаратор Java.

Профессиональная сортировка в приложении:

  1. Возможность настройки. Возможно, вы захотите выполнить сортировку по более сложным критериям, тогда настраиваемая сортировка в Java будет более гибкой.
  2. Воспроизводимость. Если вы пишете код для разных баз данных, их правила сортировки , вероятно, будут отличаться. Может быть, это проблема, и вам нужен один конкретный заказ. В Java вы можете написать Custom Collator , чтобы обеспечить одинаковый порядок вывода из всех баз данных.
2
ответ дан 4 December 2019 в 12:17
поделиться

Как лучше (по производительности): добавить сортировку по полю в SQL-запрос или отсортировать данные, когда они уже получены?

Это ORDER BY , не сортировать по.

Это вопрос компромисса: сортировка на стороне клиента распределена, что означает меньшее влияние на сервер. Однако для этого может потребоваться больше клиентских ресурсов.

Если поле не проиндексировано, чтобы вернуть весь отсортированный набор записей, серверу потребуется выполнить следующие действия:

  1. Получить весь набор записей
  2. Сортировать
  3. Отправить его по сети клиенту

, тогда как для сортировки на стороне клиента требуются только точки 1 и 3 (которые являются наименее ресурсоемкими).

Если ваш сервер должен обслуживать сотни клиентов одновременно, а вашим клиентам нужны целые наборы записей, то, скорее всего, сортировка на стороне клиента будет более эффективной.

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

Кроме того, если вам нужен не весь набор записей, а только некоторые верхние поля (например, в ORDER BY LIMIT или SELECT TOP… ORDER BY ), весь набор записей не будет должны быть получены и переданы по сети. В этом случае заказ на стороне базы данных, вероятно, будет более эффективным.

1
ответ дан 4 December 2019 в 12:17
поделиться

Всего для 5 тысяч записей это не имеет особого значения, но я бы отсортировал его по базе данных; даже если в поле нет индекса, он, вероятно, будет по крайней мере так же быстро, как и после этого.

0
ответ дан 4 December 2019 в 12:17
поделиться

Моим решением было бы создать индекс для столбца сортировки и написать запрос с предложением order by.

0
ответ дан 4 December 2019 в 12:17
поделиться
  • вы обычно извлекаете только часть этих данных? -> хороший дизайн серверной части (индексация и / или секционирование) поможет вам быстрее извлекать упорядоченное подмножество; тогда "заказ по" в базе данных является делом мгновений.
  • таблицы всегда содержат несколько строк данных? тогда «порядок по» в базе данных зависит от моментов

, и даже если вы не (не можете) оптимизировать свою базу данных, вы должны (почти) всегда предпочитать оставлять такие операции на усмотрение b.e.

0
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: