Oracle-создание таблицы без параллельной опции

по какой-то причине, когда я пытаюсь CTAS (создать таблицу как select) на большой таблице (40million~ records), я вижу в сеансе V$18 Активные сеансы с моей инструкцией sql.

когда я пытаюсь намекнуть оптимизатору использовать меньше процессоров

create table table_name parallel (degree 2) as 
       select * from large_table;

Я вижу 6 активных сеансов.

со степенью 3 я вижу 8 Активные сеансы. Я пытался!--3-->по умолчанию степень но он также создал 18 сеансов.

ранее в коде перед выполнением инструкции CREATE TABLE я изменил несколько атрибутов в своем сеансе:

alter session set workarea_size_policy = manual;
alter session set hash_area_size = 1048576000;

Я хочу создать таблицу за 1 сеанс, как это сделать ?

спасибо !

1 ответов


использовать подсказка NO_PARALLEL в предложении select инструкции CTAS. См. также обратите внимание на параллельные подсказки

create table t as
select /*+ NO_PARALLEL */ * 
from large_table;

исследование и тестирование:

версия SQL * Plus и версия базы данных Oracle:

SQL*Plus: Release 11.1.0.6.0 - Production on Fri Sep 21 11:56:58 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

я использовал два разных процесса sqlplus для подключения к одной базе данных через разные имена служб. Для выполнения CTAS будет использоваться одна работающая копия sqlplus. Будет использоваться другая копия sqlplus чтобы запросить количество сеансов.

запрос для получения количества сеансов и результатов до всего остального:

SQL> select service_name, count(*)
  2  from v$session
  3  where username = 'ME'
  4  group by service_name
  5  order by service_name;

SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
aaaaaa2                                                                   1
aaaaaa3                                                                   1

создания large_table:

SQL> create table LAO as select * from all_objects;

Table created.

SQL> exec dbms_stats.gather_table_stats(user, 'LAO');

PL/SQL procedure successfully completed.

SQL> create table large_table parallel 4 as
  2  select N.N, LAO.*
  3  from LAO
  4  cross join (select level as N from dual connect by level <= 400) N
  5  /

Table created.

SQL> select to_char(count(*), 'fm999,999,999')
  2  from large_table;

TO_CHAR(COUN
------------
42,695,200

С large_table был создан parallel 4, простой CTAS по умолчанию для 4 рабочих процессов, CTAS:

create table t as
select * from large_table;

сеансы:

SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
aaaaaa2                                                                   5
aaaaaa3                                                                   1

и noparallel опции стола. (Создание таблицы, которая по умолчанию не будет иметь параллельных планов для DML, но параллелизм large_table заставляет CTAS работать параллельно.)

drop table t;
create table t noparallel as
select * from large_table;

сеансы (фон SYS$появился в конце последнего запроса, а затем просто застрял. Я считаю, что он умирает, если не нужен в определенное время.):

SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND                                                            1
aaaaaa2                                                                   5
aaaaaa3                                                                   1

подсказка NO_PARALLEL в предложении select работает:

drop table t;
create table t as
select /*+ NO_PARALLEL */ * from large_table;

сеансы:

SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND                                                            1
aaaaaa2                                                                   1
aaaaaa3                                                                   1

один последний CTAS, где создается таблица, которая будет использовать несколько процессов по умолчанию, но не во время CTAS:

drop table t;
create table t parallel 4 as
select /*+ NO_PARALLEL */ * from large_table;

сеансы:

SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND                                                            1
aaaaaa2                                                                   1
aaaaaa3                                                                   1