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