Когда sql отличается быстрее, чем Java-программирование - PullRequest
8 голосов
/ 04 июня 2009

Если у меня есть SQL-запрос, который использует «отличный» (в оракуле), будет ли это быстрее, чем извлечение неопределенного, чем получение уникальных результатов с помощью Java-программирования?

Я где-то слышал, что oracle sql Different тяжело, но тяжелее ли оно "ручного разграничения" с помощью Java-программирования?

Спасибо, Franz

Ответы [ 9 ]

25 голосов
/ 04 июня 2009

Практическое правило заключается в том, что данные быстрее обрабатываются в базе данных, чем на вашем языке программирования.

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

  • сортировка данных для драйвера из базы данных;
  • передача по сети;
  • unmarshalling данные из драйвера в приложение;

Что касается того, что Oracle DISTINCT тяжелый, то это может означать, что никогда просто бросить DISTINCT в запрос только потому, что это кажется хорошей идеей - профилировать его с реалистичным набором данных поскольку это может иметь серьезные последствия для производительности.

11 голосов
/ 04 июня 2009

Два основных аспекта:

  • Если вам нужно перенести данные в Java, то все переносы выполняются. Выполнение работы в базе данных означает, что вам не нужно передавать данные, которые вам не нужны.
  • База данных сможет использовать свои индексы, кэши и т. Д. Для ускорения работы.

Я был бы очень удивлен, обнаружив, что получение всех данных, а затем выполнение отдельной операции в Java быстрее, чем в базе данных.

6 голосов
/ 04 июня 2009

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

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

3 голосов
/ 04 июня 2009

общее правило: позволяет базе данных выполнять работу базы данных, вы экономите память, сеть, процессор на своей стороне. Большая часть этих ресурсов также будет потрачена на базу данных, но перед тем, как идти в производство, была проведена большая оптимизация, поэтому - дайте ребенку ее мать ...

3 голосов
/ 04 июня 2009

В те времена, когда животные все еще разговаривали и играли в игры на своих атари, создание ненужного сетевого трафика было ПЛОХОЙ ПЛОХОЙ вещью.

Получение большего количества данных, чем нужно, просто не было сделано. Единственная причина, по которой я вижу, как получить все данные и манипулировать ими в Java для получения различных значений, - это когда вам понадобятся и другие данные, чуть позже. Так что для того чтобы его кешировать.

Примечание: это не то же самое, что сказать, что все делать на сервере, делать манипуляции с данными в среде с большей поддержкой манипулирования данными - это хорошо. Только не просите больше данных, чем вам нужно (кэширование как заметное исключение)

2 голосов
/ 04 июня 2009

Oracle 9 и Oracle 10 выполняют разные операции по-разному, сортирует Oracle 9, хэши Oracle 10. Вполне возможно, что в некоторых избранных случаях Java может работать быстрее, чем Oracle 9, но медленнее, чем Oracle 10.

Я думаю, что общий Oracle может сделать это быстрее. Смотрите ответ Джона Скита.

1 голос
/ 05 июня 2009

Oracle, особенно в более поздних версиях, имеет несколько методов, которые можно выбрать для реализации операции DISTINCT, включая сортировку или хэши и доступ к таблице различными способами (например, с помощью индексов или полного сканирования). Он также содержит больше информации о данных, включая статистику и ограничения, которые могут помочь ему найти оптимизацию, о которой не обязательно может знать java-программа.

Это помимо основной проблемы здесь, которая заключается в объеме данных, передаваемых по конвейеру (как уже было несколько раз сказано здесь).

1 голос
/ 04 июня 2009

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

0 голосов
/ 04 июня 2009

Отличительный SQL-код является «тяжелым», поскольку он должен исключать множественные вхождения. Этого можно достичь, сначала отсортировав данные, а затем исключив прогоны с равными элементами. Тяжесть связана с тем, что выполнение этой операции стоит.

Идиоматическим решением здесь было бы позволить базе данных выполнить подъем, а затем беспокоиться о производительности, если это станет проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...