Почти наверняка будет более эффективно сортировать данные в базе данных. Базы данных предназначены для работы с большими объемами данных. И для базы данных доступны различные оптимизации, которые не будут доступны для среднего уровня. Если вы планируете написать сверхэффективную процедуру сортировки на среднем уровне, которая использует имеющуюся у вас информацию о ваших данных, чего нет в базе данных (то есть выгрузите данные на кластер из десятков машин среднего уровня, чтобы Сортировка никогда не выплескивается на диск, используя тот факт, что ваши данные в основном упорядочены для выбора алгоритма, который обычно не был бы особенно эффективным), вы, вероятно, можете превзойти скорость сортировки базы данных. Но это бывает редко.
Например, в зависимости от запроса оптимизатор базы данных может выбрать план запроса, который возвращает данные по порядку, не выполняя сортировку. Например, база данных знает, что данные в индексе отсортированы, поэтому она может выбрать сканирование индекса, чтобы вернуть данные по порядку без необходимости материализации и сортировки всего набора результатов. Если он должен материализовать весь результат, ему нужны только столбцы, по которым вы сортируете, и какой-то идентификатор строки (т. Е. ROWID в Oracle), а не сортировка всей строки данных, как, например, реализация наивного среднего уровня. , Например, если у вас есть составной индекс (col1, col2), и вы решили отсортировать по UPPER (col2), LOWER (col1), база данных может считывать значения col1 и col2 из индекса, сортировать идентификаторы строк и затем идите за данными из таблицы. Конечно, база данных не должна этого делать - оптимизатор будет учитывать стоимость выполнения сортировки по сравнению со стоимостью выборки данных из таблицы или из различных индексов. База данных вполне может прийти к выводу, что наиболее эффективный подход - это выполнить сканирование таблицы, прочитать всю строку в память и отсортировать ее. Можно сделать вывод, что использование индекса приводит к увеличению количества операций ввода-вывода для извлечения данных, но компенсирует это уменьшением или устранением затрат на сортировку.