如何在Oracle中创建不使用并行选项的表

6

由于某种原因,当我尝试在一个大表(约4000万条记录)上执行CTAS(创建表格为选择)时,我在v$session中看到18个活动会话与我的SQL语句相关。

当我试图提示优化器使用更少的CPU时

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

我看到有6个活跃的会话。

在度数为3时,我看到8个活跃的会话。 我尝试使用默认度数,但它也创建了18个会话。

在执行CREATE TABLE语句之前,在代码中我修改了我的会话中的一些属性:

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

我想在一个会话中创建表格,应该怎么做?

谢谢!


1
完全的猜测:/*+ NO_PARALLEL */提示可能是什么?http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#sthref607 - Shannon Severance
1
@ShannonSeverance 我认为Ben David只是忘记了表名。parallel (degree 2)实际上是Oracle 7(!)中DOP的有效语法。该语法已经被弃用很长时间,但仍然有效。一些工具仍会生成旧式语法。请参阅Oracle 7手册获取详细信息。 - Jon Heller
是的,抱歉,我忘记了表名。 - planben
1个回答

8

在CTAS语句的select子句中使用NO_PARALLEL提示。 此外,还请参阅有关并行提示的注意事项

create table t as
select /*+ NO_PARALLEL */ * 
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 /*+ 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

谢谢,NO_PARALLEL提示帮了我! - planben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接