2008-10-08 2 views
2

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

+1

Какой язык вы используете? – johnc 2008-10-08 10:15:12

ответ

4

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

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

Возьмите профилировщик базы данных и проверьте план выполнения запроса.

1

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

0

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

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

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

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

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

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

+0

Стресс, который может «понравиться», потому что, если данные соответствуют ОЗУ, база данных знает (или может быть рассказана) об этом тоже, и вы вернулись в квадрат. – 2008-10-08 10:28:42

0

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

+0

Нет причин, по которым вы не можете, но по эффективности, вы действительно не должны, если у вас нет особого случая (данные вписываются в память, очень странная схема базы данных, которая приводит к плану запроса, который не может быть исправлен). – 2008-10-09 01:03:45

Смежные вопросы