Подтвердить что ты не робот

Сортировка списка с помощью SQL или в виде коллекции?

У меня есть несколько записей с датами в моей базе данных. Что лучше?:

  • Выполните их с помощью инструкции sql, а также примените order by.
  • Получить список с помощью sql и заказать их в приложении с помощью collection.sort или так?

Спасибо

4b9b3361

Ответ 1

В какой-то степени это зависит от того, сколько значений находится в полной коллекции. Если это, скажем, 20-30 значений, то вы можете сортировать в любом месте - даже относительно плохой алгоритм сортировки может сделать это быстро (избегайте Stooge Sort, хотя, что ужасно), так как это тип размера блока данных, который вы, возможно, ожидаете получить в одном ответе службы.

Но как только вы попадаете в более крупные наборы данных, вам нужно планировать гораздо более тщательно. В частности, вы хотите избежать перемещения данных, если вам это не нужно. Если данные в настоящее время присутствуют только в базе данных, вы действительно не хотите получать все это в клиенте, просто чтобы отсортировать его (относительно дорогостоящая операция), а затем выбросить практически все это. Это гораздо лучше, чтобы на самом деле сохранить данные, отсортированные в базе данных, чтобы начать с них, так что собрать их в порядок тривиально; в терминах реляционных баз данных сохранение сортировки данных функционально идентично поддержанию индекса данных. Действительно, вы можете иметь несколько индексов на данных, что может сделать даже довольно сложные запросы быстро. (Базы данных NoSQL более разнообразны, некоторые даже не поддерживают концепцию сортировки данных). Недостатком поддерживающих индексов является то, что они занимают больше места и требуют времени для поддержания, особенно когда данные создаются в первом место.

Итак... чтобы вернуться к вашему вопросу, вы, вероятно, захотите попытаться не сортировать данные в приложении: для большинства данных соответствующий индекс может быть намного более эффективным, поскольку он позволяет вашему коду даже не смотреть на нежелательные данные. Но если вам нужно извлечь все это в свое приложение по какой-то другой причине, и вы не можете довести его до сортировки, нет причин не сортировать его самостоятельно: алгоритмы сортировки Java эффективны и стабильны. Но вы должны измерить, быстрее ли извлекать его из БД в новый порядок. (Вопрос заключается в том, превышают ли надбавки БД сверхлинейные затраты на повторную сортировку, много проблем находится в домене, где "возможно, трудно сказать" - это ответ.)

Другая вещь, чтобы сбалансировать: проще ли ваш код не сортировать себя, а вместо этого делегировать это в БД. Хранение кода проще (и больше ошибок) - хорошая цель иметь...

Ответ 2

Это очень широкий вопрос, на который очень сложно ответить, и это во многом зависит от того, что вы имеете в виду лучше всего?

  • С точки зрения производительности вам просто нужно будет измерить, какая часть вашей системы является узким местом. Базы данных, как правило, очень эффективны, но они все равно могут иметь отношение к отключению, которые работают с клиентом.

  • С точки зрения разделения беспокойства это зависит от того, как сортировка имеет значение в приложении и как накладывается приложение.

Спросите себя: "Откуда же знание о сортировке данных принадлежит?" и "Что произойдет, если я перейду из хранилища реляционных баз данных в нечто другое".

Ответ 3

Системы управления базами данных (DMBS) оптимизированы для этих задач, поэтому я думаю, что вы должны придерживаться их. Особенно, если вы обращаетесь к базе данных из script, написанной на PHP или (другом языке сценариев), может быть медленнее выполнить эту задачу с помощью script. Вы также можете достичь предела памяти, разрешенного для использования PHP, если вы отсортируете массив с помощью script.

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

Ответ 4

Это очень интересный вопрос для меня, и я хочу представить другую сторону принятого ответа, который BTW - очень хороший ответ, с которым я не обязательно согласен. Просто хочу представить другую сторону. Когда я начал в своей карьере, я работал на мэйнфрейме DB2, а старожилы, которые меня учили, были ОЧЕНЬ ВНУТРИ, что сортировка должна быть выполнена вне ДБ. Их рациональным для этого является то, что он работает, который МОЖЕТ быть выгружен, и это оставляет DB бесплатной для обслуживания других запросов. Конечно, это гораздо более тонкий, чем этот. В общем, я бы сказал, что факторы, которые вы взвешиваете: A) Насколько вы заняты или находитесь в центре вашей системы, ваша база данных? Если ваш db очень занят, если у вас много обработки OLTP на клиентах или серверах приложений, а на серверах ваших клиентов или приложений много избыточной емкости, почему бы не сортировать на сервере приложений или клиенте? Даже если он менее эффективен, он распространяет работу через систему и обеспечивает вам большую пропускную способность с точки зрения всей системы. Б) Насколько велика эта сортировка? Было бы глупо, скажем, ударить стек вызовов или кучу java, потому что вы отсортировали gazillion МБ данных. C) Будет ли сортировка на вашем приложении или сервере приложений причиной пауз, латентности и т.д.? Другими словами, если ваш конкретный язык программирования имеет ДЕЙСТВИТЕЛЬНО плохие библиотеки сортировки, и вы не хотите писать свои собственные, возможно, чтобы сделать БД на 0,5 секунды лучше, чем сделать ваше приложение за 5 секунд.

Итак, как и во всех вещах, "это зависит";-). Но я думаю, что это то, от чего оно зависит.