gpt4 book ai didi

Oracle - 在没有并行选项的情况下创建表

转载 作者:行者123 更新时间:2023-12-04 14:47:39 25 4
gpt4 key购买 nike

出于某种原因,当我尝试在大表(4000 万~ 条记录)上进行 CTAS(创建表作为选择)时,我在 v$session 中看到18 与我的 sql 语句的事件 session 。

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

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

我看到 6 个事件 session 。

3级我看到 8 活跃期。
我试过 度数默认但它也创建了 18 个 session 。

以前在代码中,在执行 CREATE TABLE 语句之前,我在 session 中更改了几个属性:
alter session set workarea_size_policy = manual;
alter session set hash_area_size = 1048576000;

我想在 1 个 session 中创建表,我该怎么做?

谢谢 !

最佳答案

使用
NO_PARALLEL hint
在 CTAS 语句的 select 子句中。
另见 Note on Parallel Hints

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 进程通过不同的服务名称连接到同一个数据库。一份正在运行的 sqlplus 副本将用于执行 CTAS。 sqlplus 的另一个副本将用于查询 session 数。

在其他任何事情之前获取 session 计数和结果的查询:
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;

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

现在, noparallel表选项。 (创建一个默认情况下没有 DML 并行计划的表,但 large_table 的并行性会导致 CTAS 并行运行。)
drop table t;
create table t noparallel as
select * from large_table;

session (SYS$BACKGROUND 出现在最后一个查询的末尾,然后只是停留。我相信如果在一定时间内不需要它,它就会消失。):
SERVICE_NAME                                                       COUNT(*)
---------------------------------------------------------------- ----------
SYS$BACKGROUND 1
aaaaaa2 5
aaaaaa3 1

select 子句中的 NO_PARALLEL 提示确实有效:
drop table t;
create table t as
select /*+ NO_PARALLEL */ * from large_table;

session :
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;

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

关于Oracle - 在没有并行选项的情况下创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com