在CTAS语句的select子句中使用NO_PARALLEL提示。
此外,还请参阅有关并行提示的注意事项。
create table t as
select *
from large_table;
调查和测试:
SQL*Plus版本和Oracle数据库版本:
(将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进程通过不同的服务名称连接到同一个数据库。运行一个sqlplus副本将用于执行CTAS。另一个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
由于使用了 parallel 4
创建的 large_table
,简单的 CTAS 默认会使用 4 个工作进程:
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;
Sessions (SYS$BACKGROUND出现在上一个查询的最后,然后就一直存在。我相信如果在一定时间内不需要它,它会自动关闭):
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 5
aaaaaa3 1
在选择子句中使用的NO_PARALLEL提示是有效的:
drop table t;
create table t as
select * 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 * from large_table;
会话:
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 1
aaaaaa3 1
/*+ NO_PARALLEL */
提示可能是什么?http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#sthref607 - Shannon Severanceparallel (degree 2)
实际上是Oracle 7(!)中DOP的有效语法。该语法已经被弃用很长时间,但仍然有效。一些工具仍会生成旧式语法。请参阅Oracle 7手册获取详细信息。 - Jon Heller