powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как быстро выгрузить из Oracle в TEXT/CSV
11 сообщений из 11, страница 1 из 1
Как быстро выгрузить из Oracle в TEXT/CSV
    #39469724
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: быстро выгружать из Оракла 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
Как быстро выгрузить из Oracle в TEXT/CSV
    #39469729
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,
Дьявол кроется в деталях
Покажи скрипт выгрузки
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39469731
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,
Какая система, какая fs куда вываливается spool
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39469733
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередность не очень правильная
Как правило, SQL*Plus на сервере с ARRAYSIZE 100-1000 быстрее всего
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39469734
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вывод на экран в sqlplus отключил?

чем проблема саму выгрузку вручную по условию распараллелить?
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39473995
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скрипт выгрузки 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
Как быстро выгрузить из Oracle в TEXT/CSV
    #39474002
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12
Код: plsql
1.
set termout on
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39474023
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

прошу пояснить зачем
...
Рейтинг: 0 / 0
Как быстро выгрузить из Oracle в TEXT/CSV
    #39474025
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на п.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
Как быстро выгрузить из Oracle в TEXT/CSV
    #39474084
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12скрипт выгрузки sqlplus такой
Код: plsql
1.
2.
3.
4.
...
spool c:\temp\test.out 
select * from ... 
spool off 


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


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