более быстрый способ извлечь все записи из оракула - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть таблица оракула, содержащая 900 миллионов записей, эта таблица разделена на 24 части и имеет индексы:

Я пытаюсь использовать подсказка , и я помещаю fetch_buffer в 100000 :

select /+ 8 parallel +/
* from table

требуется 100 минут, чтобы получить 100 миллионов записей

мой вопрос: есть ли способ быстрее получить 900 миллионов (все данные в таблице)? я должен использовать партиции и сделал 24 последовательных запроса? или я должен использовать индексы и разделить свой запрос на 10 запросов, например

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Не совсем ответ, но слишком длинный для комментария.

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

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

При использовании JDBC не забудьте установить размер выборки курсора, чтобы уменьшитькруговое отключение - setFetchSize. Значение по умолчанию крошечное (думаю, 10), попробуйте что-то вроде 1000, чтобы увидеть, как это помогает.

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

Мой подход заключается в написании Java-программы для работы с диапазоном значений в качестве параметров командной строки и эксперименте по поискукакой размер диапазона и одновременные экземпляры Java дают оптимальную производительность. Диапазон, вероятно, будет находиться в пределах отдельных разделов, поэтому вы получите выгоду от сокращения разделов (при условии, что значение диапазона - это индексированный столбец, в идеале - ключ раздела).

Грубо говоря, я бы начал с диапазона 5 м и запустил бы параллельный запуск. экземпляры, соответствующие количеству ядер ЦП - 2;это не научно полученное число, которое я обычно использую в качестве первого удара, и посмотрим, что произойдет.

0 голосов
/ 10 ноября 2019

Сеть почти наверняка является узким местом здесь. Параллелизм Oracle влияет только на способ извлечения данных из базы данных, но данные по-прежнему отправляются клиенту с помощью одного потока.

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

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

select * from table partition (p1);
select * from table partition (p2);
...
...