pla*_*ben 6 oracle plsql plsqldeveloper oracle-sqldeveloper
出于某种原因,当我在一个大表(4000万〜记录)上尝试CTAS(创建表为select)时,我在v $ session 18中看到了我的sql语句的活动会话.
当我试图暗示优化器使用更少的CPU时
create table table_name parallel (degree 2) as
select * from large_table;
Run Code Online (Sandbox Code Playgroud)
我看到6个活跃的会话.
学位3我看到8个活跃的课程.我尝试了学位默认,但它也创造了18个课程.
以前在代码中,在执行CREATE TABLE语句之前,我在会话中更改了一些属性:
alter session set workarea_size_policy = manual;
alter session set hash_area_size = 1048576000;
Run Code Online (Sandbox Code Playgroud)
我想在1个会话中创建表,我该怎么做?
谢谢 !
在CTAS语句的select子句中使用 NO_PARALLEL提示.另请参见并行提示说明
create table t as
select /*+ NO_PARALLEL */ *
from large_table;
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我使用两个不同的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
Run Code Online (Sandbox Code Playgroud)
创建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
Run Code Online (Sandbox Code Playgroud)
自large_table创建以来parallel 4,一个简单的CTAS默认为4个工作进程,CTAS:
create table t as
select * from large_table;
Run Code Online (Sandbox Code Playgroud)
会议:
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
aaaaaa2 5
aaaaaa3 1
Run Code Online (Sandbox Code Playgroud)
现在,noparallel表选项.(创建一个默认情况下不会有DML并行计划的表,但并行性large_table导致CTAS并行运行.)
drop table t;
create table t noparallel as
select * from large_table;
Run Code Online (Sandbox Code Playgroud)
会话(SYS $ BACKGROUND显示在最后一个查询的末尾,然后只是停留.我相信如果在一定时间内不需要它会死掉.):
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 5
aaaaaa3 1
Run Code Online (Sandbox Code Playgroud)
select子句中的NO_PARALLEL提示确实有效:
drop table t;
create table t as
select /*+ NO_PARALLEL */ * from large_table;
Run Code Online (Sandbox Code Playgroud)
会议:
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 1
aaaaaa3 1
Run Code Online (Sandbox Code Playgroud)
最后一个CTAS,其中创建了一个默认使用多个进程的表,但在CTAS期间不会:
drop table t;
create table t parallel 4 as
select /*+ NO_PARALLEL */ * from large_table;
Run Code Online (Sandbox Code Playgroud)
会议:
SERVICE_NAME COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 1
aaaaaa3 1
Run Code Online (Sandbox Code Playgroud)