Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как быстро выгрузить из Oracle в TEXT/CSV / 11 сообщений из 11, страница 1 из 1
09.06.2017, 17:54
    #39469724
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Задача: быстро выгружать из Оракла 11.2 большие объемы данных (10-ки гб/сут) в TEXT/CSV

У Кайта
https://asktom.oracle.com/pls/apex/f?p=100:11:::NO::P11_QUESTION_ID:88212348059
в порядке возрастания скорости значатся способы:

utl_file
sql*plus spool
pro*C program = https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:459020243348


на промышленном сервере sql*plus spool простого селекта (одна многогигабайтная таблица без условий) дает всего 5 мбайт/сек,
при этом:
- копирование файлов по сети между теми же машинами дает в 10 раз больше, т.о. проблема не в сети
- CTAS из исходной таблицы в другую проходит за секунды


вопросы:
1) это много или мало (какая скорость у вас)?
2) как найти узкое место (кто виноват? оракл или пишущий клиент) и что сделать, чтобы скорость увеличить?
3) вы знаете способы быстрее перечисленных? может быть, CTAS в external table (datapump)?
GoldenGate и прочие средства "нечитать из Оракла" не предлагать по условиям задачи ;)

также тестирование показывает, что несколько одновременно запущенных sql*plus spool дают суммирование скорости (3 сессии - в 3 раза быстрее и т.д.)

+отсюда вопрос:
4) возможно ли неким автоматизированным способом разрезать один набор данных и выгружать его многими сессиями сразу (например, первая сессия берет первые строки, вторая - вторые и т.д.)
тупой вариант реализации:
раз внутри сервера переливка быстрая - сделать "временную" таблицу с партицированием на нужное кол-во секций, а перед выгрузкой ее очищать и заполнять новым, затем запускать много выгружалок по числу партиций

какие еще? pipelined функция это может сделать без материализации, например? как?
...
Рейтинг: 0 / 0
09.06.2017, 18:01
    #39469729
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Alexus12,
Дьявол кроется в деталях
Покажи скрипт выгрузки
...
Рейтинг: 0 / 0
09.06.2017, 18:02
    #39469731
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Alexus12,
Какая система, какая fs куда вываливается spool
...
Рейтинг: 0 / 0
09.06.2017, 18:04
    #39469733
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Очередность не очень правильная
Как правило, SQL*Plus на сервере с ARRAYSIZE 100-1000 быстрее всего
...
Рейтинг: 0 / 0
09.06.2017, 18:06
    #39469734
DВА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
вывод на экран в sqlplus отключил?

чем проблема саму выгрузку вручную по условию распараллелить?
...
Рейтинг: 0 / 0
19.06.2017, 10:55
    #39473995
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
скрипт выгрузки sqlplus такой
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select systimestamp from dual; 
set termout off 
set arraysize 1000 
set rowprefetch 2 
set pages 0 
set trimspool on 
spool c:\temp\test.out 
select * from ... 
spool off 
set termout on 
select systimestamp from dual; 



система - линуксы везде

есть соображения по автоматизированному распараллеливанию (п.4 первого сообщения)?
...
Рейтинг: 0 / 0
19.06.2017, 11:01
    #39474002
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Alexus12
Код: plsql
1.
set termout on
...
Рейтинг: 0 / 0
19.06.2017, 11:35
    #39474023
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Elic,

прошу пояснить зачем
...
Рейтинг: 0 / 0
19.06.2017, 11:37
    #39474025
Alexus12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
на п.4 "возможно ли неким автоматизированным способом разрезать один набор данных и выгружать его многими сессиями сразу" найден такой ответ:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:10498431232211

you don't need to split the table into 4 -- you can just use ROWID ranges. If you use this script I call "split" 

------------------------------------------------- 


set verify off 
define TNAME=&1 
define CHUNKS=&2 


select grp, 
dbms_rowid.rowid_create( 1, data_object_id, lo_fno, lo_block, 0 ) min_rid, 
dbms_rowid.rowid_create( 1, data_object_id, hi_fno, hi_block, 10000 ) max_rid 
from ( 
select distinct grp, 
first_value(relative_fno) 
over (partition by grp order by relative_fno, block_id 
rows between unbounded preceding and unbounded following) lo_fno, 
first_value(block_id ) 
over (partition by grp order by relative_fno, block_id 
rows between unbounded preceding and unbounded following) lo_block, 
last_value(relative_fno) 
over (partition by grp order by relative_fno, block_id 
rows between unbounded preceding and unbounded following) hi_fno, 
last_value(block_id+blocks-1) 
over (partition by grp order by relative_fno, block_id 
rows between unbounded preceding and unbounded following) hi_block, 
sum(blocks) over (partition by grp) sum_blocks 
from ( 
select relative_fno, 
block_id, 
blocks, 
trunc( (sum(blocks) over (order by relative_fno, block_id)-0.01) / 
(sum(blocks) over ()/&CHUNKS) ) grp 
from dba_extents 
where segment_name = upper('&TNAME') 
and owner = user order by block_id 
) 
), 
(select data_object_id from user_objects where object_name = upper('&TNAME') ) 
/ 

-------------------------------- eof -------------------- 


and run it 

SQL> @split T 4 

it'll produce something like: 

big_table@ORA920LAP>; @split big_table 4 

GRP MIN_RID MAX_RID 
---------- ------------------ ------------------ 
0 AAAHchAAJAAAAAJAAA AAAHchAAJAAAA4ICcQ 
1 AAAHchAAJAAAA4JAAA AAAHchAAJAAABwICcQ 
2 AAAHchAAJAAABwJAAA AAAHchAAJAAACgICcQ 
3 AAAHchAAJAAACgJAAA AAAHchAAJAAADgICcQ 


those are 4 non-overlapping rowid ranges that complete "cover" the table -- so, you can query: 


for x in ( select /*+ FIRST_ROWS */ * from t where rowid between X and Y ) 
loop 

and just pass in a rowid pair for X and Y. that way, you can use the above query to generate 4 rowid ranges, insert them into the job parameter table and run 4 copies of your procedure. they'll each process about 1/4th of the table. 
...
Рейтинг: 0 / 0
19.06.2017, 12:57
    #39474084
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
Alexus12скрипт выгрузки sqlplus такой
Код: plsql
1.
2.
3.
4.
...
spool c:\temp\test.out 
select * from ... 
spool off 


Вот прямо так и написано SELECT * FROM ... ?
...
Рейтинг: 0 / 0
20.06.2017, 14:59
    #39474798
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро выгрузить из Oracle в TEXT/CSV
А?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как быстро выгрузить из Oracle в TEXT/CSV / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]