оракул sql плюс шпуля - PullRequest
       17

оракул sql плюс шпуля

2 голосов
/ 01 апреля 2010

Я использую 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;

Спасибо.

Ответы [ 7 ]

6 голосов
/ 07 апреля 2010

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

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

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

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

2 голосов
/ 02 апреля 2010

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

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

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

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
1 голос
/ 01 апреля 2010

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

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

1 голос
/ 01 апреля 2010

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

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

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

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 03 апреля 2010

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

0 голосов
/ 02 апреля 2010

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

SET FLUSH OFF

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

...