平行度被默默忽略了吗?

Is the parallel degree silently ignored?

我的查询如下:

ALTER TABLE EMPLOYEE MODIFY LOB(DOCUMENT) (SHRINK SPACE);

table 的平行度为 1 :

SELECT DEGREE FROM USER_TABLES WHERE TABLE_NAME = 'EMPLOYEE';

结果:1

Table EMPLOYEE 未分区。

如果我以并行度启动相同的查询,系统不会抱怨,但会被默默忽略吗?

ALTER TABLE EMPLOYEE MODIFY LOB(DOCUMENT) (SHRINK SPACE) PARALLEL 8;

查询是否有可能更快?

您是否启用了并行 ddl? alter session force parallel ddl parallel 8

向我们展示您的会话参数:

select * 
from v$ses_optimizer_env e
where e.sid=userenv('sid')
and (
    name like '%parallel%'
 or name like '%cpu%'
 or name like '%optim%'
)
order by name

DDL 操作将 运行 在以下情况下并行执行:

  • table的度数不是1

  • alter session enable parallel ddl
  • 已启用会话并行 ddl

无论如何,在 运行 任何可以 运行 并行的 DDL 操作之前,您应该始终 运行 alter session enable parallel ddl。虽然文档上没有说shrink可以运行并行,但是语法是允许的,所以我猜你可以测试它是否运行s更快

非分区 table 和索引的并行 DDL 语句是:

CREATE INDEX

CREATE TABLE AS SELECT

ALTER INDEX REBUILD

分区 table 和索引的并行 DDL 语句是:

CREATE INDEX

CREATE TABLE AS SELECT

ALTER TABLE {MOVE|SPLIT|COALESCE} PARTITION

ALTER INDEX {REBUILD|SPLIT} PARTITION

例子

SQL>  create table t ( c1 clob ) ;

Table created.

SQL> alter table t  MODIFY LOB(c1)  (SHRINK SPACE) PARALLEL 8 ;

Table altered.

您可以随时移动段 lob 而不是 SHRINK,我可以保证 100% 运行 并行且更快。问题是如果你有索引,那里就会失效。

更新

要移动 lob 段,您必须执行以下操作

移动 LOB:

SQL> spoolmovelob.sql
SET HEADING OFF
SET pagesize 200
SET linesize 200
select 'ALTER TABLE <owner>.'||TABLE_NAME||' MOVE LOB('||COLUMN_NAME||') STORE AS (TABLESPACE <Tablespace_name>) parallel 5 nologging;' from dba_lobs where TABLESPACE_NAME='<Tablespace_name>';

Note: The above query will include all the LOB,LOBSEGMENT,LOBINDEXES

移动Table:

SQL> spool /home/oracle/moveTables.sql
SET HEADING OFF
SET PAGESIZE 200
SET LINESIZE 200
select ' ALTER TABLE <owner>.'||TABLE_NAME||' MOVE TABLESPACE <Tablespace_name>) parallel 5 nologging;' from dba_tables where owner='<owner name>';

移动指数:

SQL> spool /home/oracle/moveIndex.sql
SET HEADING OFF
SET long 9999
SET linesize 200
select 'alter index <owner>.'||index_name||' from dba_indexes 'rebuild tablespace <Tablespace_name>)   online parallel X nologging;' where owner='<owner>.';

记得把X换成具体度数。

根据 Oracle documentation ALTER TABLE MODIFY 操作不能 运行 并行。

If I launch the same query with a parallel degree, the system does not complain, but is it silently ignored ?

根据您的数据库和特定会话的配置方式,它可能会被忽略。

Any chance that the query will be faster ?

这在很大程度上取决于您的特定数据集、可用的系统资源以及如何设置并行度。注意parallel_degree_policy设置;它控制默认行为。

请参阅 Oracle 白皮书“Parallel Execution with Oracle Database”以获得更完整的理解。尤其是阅读第 21 页开始的“控制并行执行”部分。