Я хочу поместить "случайный" вывод из моего набора результатов (около 1,5 миллионов строк) в файл в отсортированном виде. Я знаю, что могу использовать сортировку по команде в моем запросе, но эта команда «дорогая». Можете ли вы сказать мне, есть ли какой-либо алгоритм для записи строк набора результатов в файл, чтобы содержимое было отсортировано в конце, и могу ли я повысить производительность с помощью этого? Я использую java 1.6, и запрос имеет несколько объединений.




Определите индекс для критериев сортировки в своей таблице, после чего вы сможете без проблем использовать предложение order by и записать файл в том виде, в котором он поступает из набора результатов.
Если ваш запрос имеет несколько объединений, создайте правильные индексы для объединений и критериев сортировки. Вы можете сортировать данные в своей программе, но вы зря теряете время. Это время будет намного ценнее, если вы научитесь правильно настраивать / использовать вашу базу данных, а не изобретать заново алгоритмы сортировки, уже имеющиеся в ядре базы данных.
Возьмите профилировщик своей базы данных и проверьте план выполнения запроса.
По моему опыту, сортировка на стороне базы данных обычно выполняется так же быстро или быстрее ... конечно, если столбец, по которому вы сортируете, проиндексирован
Если вы читаете из базы данных, получение отсортированного вывода не должно быть таким «дорогим», если у вас есть соответствующие индексы.
Но иногда со сложными запросами оптимизатору SQL очень сложно применить индексы. В этом случае БД просто накапливает результаты во временной таблице и прозрачно сортирует их для вас.
Очень маловероятно, что вы сможете сопоставить уровень оптимизации, заложенный в ваш движок БД; но если ваша проблема возникает из-за того, что вы выполняете некоторую постобработку данных, которая сводит на нет любую сортировку, выполняемую БД, тогда у вас нет альтернативы, кроме сортировки ее самостоятельно.
Опять же, проще всего было бы использовать БД: просто записать во временную таблицу с соответствующим индексом и выгрузить оттуда.
Если вы уверены, что данные всегда будут помещаться в ОЗУ, вы можете отсортировать их в памяти. Это единственный случай, когда вы мощь сможете превзойти движок БД только потому, что знаете, что вам не понадобится HD-доступ.
Но это много «если». Лучше оставайся со своей БД
Если вам нужно отсортировать данные, это должен сделать кто-то - вы или база данных. Конечно, проще добавить ORDER BY в запрос. Но нет причин, по которым вы не можете отсортировать это в памяти на своей стороне. Самый простой способ - разбить данные в отсортированной коллекции (TreeSet, TreeMap) с помощью компаратора для сортировки по нужному столбцу. Затем выпишите отсортированные данные.
Нет никаких причин, по которым вы не можете, но с точки зрения производительности вам действительно не следует этого делать, если у вас нет очень особого случая (данные умещаются в памяти, очень странная схема базы данных, которая приводит к плану запроса, который не может быть исправлен).
Подчеркните, что «может», пожалуйста, потому что, если данные умещаются в ОЗУ, база данных знает (или может быть сообщена) об этом, и вы снова в исходном положении.