oracle sql plus катушка

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

Здесь ниже мои параметры sql plus:

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;

Спасибо.


person CC.    schedule 01.04.2010    source источник
comment
Здесь есть несколько хороших советов по использованию sql plus, но я должен спросить: зачем так много кататься через sql plus? Создайте простое приложение, которое сделает это за вас, тогда у вас будет больше контроля над выводом, и его будет легко повторно использовать или изменять для других запросов. Просто говорю'   -  person nothingisnecessary    schedule 14.09.2013


Ответы (7)


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

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

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

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

person Indolent Coder    schedule 06.04.2010

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

в моем тесте он был немного быстрее, примерно на 20 тыс. строк, но, может быть, оно того стоит.

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

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
person Matthew Watson    schedule 02.04.2010

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

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

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

person Quassnoi    schedule 01.04.2010
comment
Запрос оптимизирован, я работал над его ускорением. Итак, осталась свалка. Файл в нем около 400МБ. Думаю что-то вроде размера буфера дампа, но не знаю, есть ли такая опция. - person CC.; 01.04.2010
comment
Сам запрос занимает 1,5 минуты, а все остальное - дамп. - person CC.; 01.04.2010
comment
Используя браузер сессий Toad, я могу видеть время, необходимое для выполнения запроса, и время, необходимое для создания дампа. - person CC.; 01.04.2010

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

Кроме того, с таким большим объемом данных вам действительно нужно спутировать их в файл? А можно вместо этого сделать экспорт?

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

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

SET FLUSH OFF

Но результат зависит от вашей ОС.

person user38123    schedule 01.04.2010
comment
Да, только что попробовал, но результат тот же. Спасибо, в любом случае. - person CC.; 02.04.2010

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

person AndyDan    schedule 03.04.2010
comment
Да ладно. Я перечитал ваш пост и теперь вижу, что это уже есть в ваших настройках. - person AndyDan; 03.04.2010

Некоторые варианты доступны у настоящего гуру Тома Кайта.

person Adam Hawkes    schedule 09.04.2010