Запись набора результатов в файл с отсортированным выводом - PullRequest
2 голосов
/ 08 октября 2008

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

Ответы [ 4 ]

4 голосов
/ 08 октября 2008

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

Если в вашем запросе есть несколько объединений, создайте соответствующие индексы для объединений и критериев сортировки. Вы можете отсортировать данные в вашей программе, но вы бы тратили время. Это время будет гораздо ценнее, если вы научитесь правильно настраивать / использовать базу данных, а не изобретать алгоритмы сортировки, уже присутствующие в ядре базы данных.

Получите профилировщик вашей базы данных и проверьте план выполнения запроса.

1 голос
/ 08 октября 2008

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

0 голосов
/ 08 октября 2008

Если вам нужны отсортированные данные, кто-то должен это сделать - вы или база данных. Конечно, проще добавить ORDER BY к запросу. Но нет причин, по которым вы не можете сортировать их в памяти на своей стороне. Самый простой способ - разделить данные на части в отсортированной коллекции (TreeSet, TreeMap), используя Comparator для сортировки по нужному столбцу. Затем запишите отсортированные данные.

0 голосов
/ 08 октября 2008

Если вы читаете из базы данных, сортированный вывод не должен быть таким «дорогим», если у вас есть соответствующие индексы.

Но иногда для сложных запросов оптимизатору SQL очень сложно применять индексы. В этом случае БД просто накапливает результаты во временной таблице и сортирует их для вас прозрачно.

Маловероятно, что вы могли бы соответствовать уровню оптимизаций, введенных в ваш движок БД; но если ваша проблема возникает из-за того, что вы выполняете некоторую постобработку данных, которая сводит на нет любую сортировку, выполняемую БД, у вас нет другого выбора, кроме как сортировать ее самостоятельно.

Опять же, проще всего было бы использовать БД: просто записать во временную таблицу с соответствующим индексом и вывести из нее дамп.

Если вы уверены, что данные всегда будут помещаться в ОЗУ, вы можете отсортировать их в памяти. Это единственный случай, когда вы можете быть в состоянии превзойти механизм БД, просто потому что вы знаете, что вам не понадобится доступ к HD.

Но это много "если". Лучше оставайся с БД

...