首页 > 解决方案 > 平行度是否被默默忽略?

问题描述

我的查询如下:

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

表的平行度为 1:

SELECT DEGREE FROM USER_TABLES WHERE TABLE_NAME = 'EMPLOYEE';

结果:1

表 EMPLOYEE 未分区。

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

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

查询会更快吗?

标签: oracleoracle12c

解决方案


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

  • 表的度数不是 1

或者

  • 会话并行 ddl 已由alter session enable parallel ddl

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

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

CREATE INDEX

CREATE TABLE AS SELECT

ALTER INDEX REBUILD

分区表和索引的并行 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.

代替 SHRINK,您始终可以移动段 lob,我可以保证 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

移动表:

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 替换为特定的度数。


推荐阅读