Быстрый выбор Oracle [Огромные данные] - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть проект, в соответствии с которым я читаю огромные объемы данных из базы данных Oracle с Java.

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

У кого-нибудь есть что-нибудь, что я мог бы прочитать, что помогло бы мне в моем положении?

Ответы [ 4 ]

3 голосов
/ 25 февраля 2010

Вы не предоставили нам много информации о том, почему необходимо будет вносить «огромные объемы данных» в приложение Java, а не обрабатывать их на стороне базы данных. Хотя могут быть исключения, обычно это сигнал для переосмысления дизайна. Как правило, в Oracle наиболее эффективно выполнять как можно больше работы с чистыми операциями над множествами (SQL) с последующей процедурной обработкой с помощью механизма rdbms (PL / SQL), прежде чем возвращать результаты в клиентское приложение.

3 голосов
/ 25 февраля 2010

Используйте метод setFetchSize (int) в Statement или PreparedStatement перед открытием запроса. Вы должны экспериментировать с разными размерами. Попробуйте 75 в качестве отправной точки.

При небольшом использовании люди говорили, что «сладкое пятно» массового извлечения PL / SQL находится между 2000 и 3000, но я видел один тест, который показал, что 75 был оптимальным.

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

3 голосов
/ 25 февраля 2010

Oracle поддерживает параллельный DML . В частности это относится к запросам SELECT. В конечном итоге узким местом будет скорость чтения IO. Либо используйте более быстрые диски, либо распределяйте данные по многим дискам.

Обновление

Как указано APC в комментариях Параллельные запросы / DML - это функция Entreprise Edition и недоступна в стандартной версии.

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

По ссылке выше:

Параллельное выполнение не обычно полезно для:

  • Среды, в которых ресурсы ЦП, памяти или ввода-вывода уже интенсивно используется. Параллельное исполнение предназначен для использования дополнительных доступные аппаратные ресурсы; если нет такие ресурсы доступны, то параллельное выполнение не даст выгоды и действительно могут быть вредными на производительность.
2 голосов
/ 26 февраля 2010

Во-первых, «огромные данные» для пользователей базы данных составляют [по меньшей мере] гигабайты, и в этом случае я подозреваю, что ваши проблемы будут заключаться в том, чтобы считывать такие объемы в память ваших процессов и объединять их там. Как вы думаете, почему однопоточное выделение будет узким местом?

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

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

Если выборка сортируется или поступает из хеш-соединения, вы можете использовать память более эффективно с одним потоком. Несколько сеансов должны были бы совместно использовать память машины.

Если обработка процессора интенсивна, то могут помочь несколько потоков. Это может быть так же просто, как иметь несколько соединений из Java, каждое из которых получает различный фрагмент данных (например, A-K и L-Z), но это будет очень сильно зависеть от SELECT.

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

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