2010-04-01 6 views
2

Я использую sql plus для выполнения запроса (выбор) и выдачу результата в файл с использованием опции spool. У меня около 14 миллионов строк, и для создания дампа требуется около 12 минут. Мне было интересно, есть ли что-то, чтобы сделать свалку быстрее?oracle sql plus spool

Здесь ниже моей SQL плюс варианты:

whenever sqlerror exit sql.sqlcode 
     set pagesize 0 
     set linesize 410 
     SET trimspool ON 
     set heading on 
     set feedback off 
     set echo off 
     set termout off 
     spool file_to_dump_into.txt 
     select * from mytable; 

Спасибо.

+0

Некоторые полезные советы по использованию sql * plus здесь, но я должен спросить: зачем так много использовать в sql * plus? Создайте простое приложение, чтобы сделать это для вас, тогда вы получите больше контроля над выходом, и его легко будет повторно использовать или изменить для других запросов. Just sayin ' – nothingisnecessary

ответ

1

С типичным запросом 14M записей составляет не менее нескольких сотен мегабайт данных для извлечения из сервера, передачи через соединение и сохранения на диск.

Учитывая это, 12 минут не звучит слишком много для меня.

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

+0

Запрос оптимизирован, я работал над тем, чтобы сделать его быстрее. Итак, что осталось - это свалка. Файл имеет около 400 МБ. Я думаю о чем-то вроде размера буфера дампа, но я не знаю, есть ли такой вариант. –

+0

Сам запрос занимает 1,5 минуты, а остальное - свалка. –

+0

Использование браузера сеанса жаба Я вижу время, необходимое для выполнения запроса, и время, необходимое для создания дампа. –

1

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

Также с этим большим количеством данных вам действительно нужно заправить его в файл? Можете ли вы сделать экспорт вместо этого?

+0

Хороший вопрос. На самом деле мне нужно создать катушку, потому что выбор не является простым выбором. Я делаю небольшую плату за значение поля, основанное на предыдущем значении этого поля. В конце я создаю отформатированный файл (а не только столбцы). Итак, это своего рода обязательная катушка. Я делаю свой тест на тестовой машине. Я попрошу посмотреть, находится ли в рабочем окружении unix-сервер на том же компьютере, что и сервер oracle. –

0

Вы можете включить буферизацию вывода, добавив к вам сценарий

SET FLUSH OFF 

Но результат зависит от вашей операционной системы.

+0

Да, я просто попробовал, но тот же результат. Спасибо, в любом случае. –

2

Возможно, вам будет удобно использовать UTL_FILE, но, вероятно, не так быстро.

В моем тесте он был немного быстрее примерно на 20 тыс. Строк, ударил более 14 миллионов, хотя и это может стоить того.

Я считаю, что если вы хотите получить что-то более быстрое, то способ пойти будет про * c .. но я не понял этого, поэтому не могу посоветовать.

set pagesize 1000 
set FLUSH OFF 
drop user usera cascade; 
create user usera default tablespace users identified by abc123; 
grant create session to usera; 
grant resource to usera; 

create or replace directory testdir as '/tmp'; 
grant read,write on directory testdir to usera; 
grant execute on UTL_FILE to usera; 

connect usera/abc123; 

set timing on 

spool /tmp/spooltest.txt 
select object_name from all_objects; 
spool off 

DECLARE 
v_file UTL_FILE.FILE_TYPE; 
TYPE t_col is table of all_objects.object_name%type index by PLS_INTEGER; 
v_object_names t_col; 

BEGIN 
    v_file := UTL_FILE.FOPEN('TESTDIR','utlfiletext.txt','w'); 

    select object_name BULK COLLECT INTO v_object_names 
    from all_objects; 

    for idx IN 1 .. v_object_names.COUNT LOOP 
    UTL_FILE.PUT_LINE(v_file, v_object_names(idx), FALSE); 
    END LOOP; 

    UTL_FILE.FCLOSE(v_file); 
END; 
/

Результаты. Верхний результат составляет от SQLPLUS только снизу, используя UTL_FILE

23931 rows selected. 

Elapsed: 00:00:06.60 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:05.45 
0

При получении много результатов из запроса в SQL * Plus, я обнаружил, что одна вещь, которая занимает много времени, фактическое отображение данных. Если вы буферизируете данные в файл, вы можете SET TERMOUT OFF, и запрос выполняется намного быстрее, поскольку ему не нужно тратить время на его запись на экран.

+0

О, неважно. Я перечитываю сообщение и вижу, что у вас уже есть это в ваших настройках. – AndyDan

6

Вы связываете & с разделителями столбцов или экспортируете фиксированную ширину?

См. Эту документацию по адресу SQL*Plus Script Tuning. Ниже приведено несколько возможных способов его ускорения:

  1. Убедитесь, что LINESIZE как можно меньше. Добавьте максимальную длину столбца (плюс разделители, если не фиксированная ширина).Это может существенно повлиять на производительность, поскольку SQL * Plus выделяет этот объем памяти для каждой экспортируемой строки. 410 не так уж и большой, но если вы можете уменьшить его, что бы помогло. По моему опыту, это имело большое значение.
  2. Не включайте TRIMSPOOL. Это также может иметь большое значение. Затем каждая строка будет дополнена LINESIZE, но с оптимальной строкой и в зависимости от того, как вы используете файл, это может быть приемлемым. Однако, если вы хотите полностью уничтожить конечные пробелы, часто бывает быстрее обрезать их, используя другие методы post-export.
  3. Играйте с ARRAYSIZE. Это может помочь (немного). Он устанавливает размер выборки для SQL * Plus. Значение по умолчанию - 15 строк. Нападение на, скажем, 100 может помочь, но слишком большой может снизить скорость.

Надеюсь, это поможет!

+0

'arraysize' здесь большой. По моему опыту это может иметь огромное значение - я бы ожидал улучшения порядка для набора результатов в 14 миллионов строк. Мне нужно попробовать не-тримпульс. –

+0

Ссылка сейчас мертва. Я думаю, что это та же самая страница: [SQL plus script tuning] (http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch8.htm) (URL июля 2016 г.) –

0

Некоторые варианты доступны от Tom Kyte, который является настоящим гуру.

Смежные вопросы