Плюсы и минусы сортировки данных в БД? - PullRequest
9 голосов
/ 17 мая 2010

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

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

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

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

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

Ответы [ 8 ]

9 голосов
/ 17 мая 2010

Если это поле проиндексировано, то средняя БД в этой задаче будет намного эффективнее, чем 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();
5 голосов
/ 17 мая 2010

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

2 голосов
/ 17 мая 2010

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

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

Про сортировку в приложении:

  1. Customizability. Возможно, вы захотите отсортировать по более сложным критериям, тогда пользовательская сортировка в Java будет более гибкой.
  2. Воспроизводимость. Если вы кодируете для разных баз данных, их правила сортировки , вероятно, будут отличаться. Может быть, это проблема, и вы хотите один конкретный odering. В Java вы можете написать Custom Collator , чтобы убедиться, что выходные данные из всех баз данных упорядочены одинаково.
1 голос
/ 17 мая 2010

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

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

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

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

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

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

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

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

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

0 голосов
/ 18 июня 2011

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

http://casperdatasets.googlecode.com

он эффективно работает как таблица в памяти и позволяет выполнять поиск, фильтрацию и сортировку данных, находящихся в памяти (и в java). он работает очень быстро для количества записей, с которыми вы пытаетесь работать, и вам не нужно интегрироваться с тяжелой средой ORM.

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

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

0 голосов
/ 17 мая 2010

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

0 голосов
/ 17 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...