Oracle DDL的概念
DataDefinition Language(DDL),数据定义语言DDL用来创建数据库中的各种对象——表、视图、索引、同义词、聚簇等如:CREATETABLE/VIEW/INDEX/SYN/CLUSTER,主要的命令有CREATE、ALTER、DROP等。DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
Oracle并行DDL
DBA的大规模批操作适合并行化,因为其可以有丰富的计算资源与系统资源可以使用。类似于创建数据表,创建索引,重组索引,等等的DDL操作完全科院并发的实现已重分利用机器的硬件资源。Oracle基于这个思想实现了并行DDL。
Oracle中可以并发执行的DDL包括:
CreateIndex:多个并行执行服务器可以扫描表,对数据排序,并把有序的段写出到索引结构。
CreateTable AS Select:执行select的查询可以使用并行查询来执行,表加载本身可以并行完成。
AlterIndex Rebuild:索引结构可以并行重建。
AlterTable Move:表可以并行移动
AlterTable Split|Coalesce Partition:单个表分区可以并行的分解或者合并。
AlterIndex Split Partition:索引分区可以并行的分解。其中前4个操作还适用于单个的表/索引分区。Create Table用于有索引结构的表的时候也可以并行的执行。
使用Oracle并行DDL
CREATEINDEX,ALTERINDEX ... REBUILD,ALTERINDEX ... MOVE PARTITION,ALTERINDEX ...SPLITPARTITION以及CREATETABLE ... AS SELECT等可以进行并行执行的DDL语句在有PARALLEL(DEGREEN)子句或者ALTERSESSIONFORCEPARALLEL DDL 声明(比PARALLEL子句优先级低)的时候会被Oracle并行执行,并行度为N,即启用4个执行服务器去并行的执行该DDL操作中的子操作。如果没有显示的指定并行度,Oralce会根据任务量和实际的机器情况(可用处理器数目,用户情况,内存情况等)去制定并行度是多少,可用是完全不并行(串行),也可以启用可用处理器数目的并行执行服务器去执行。
下面是一个实际使用的例子:
create index id1 on dept(num) PARALLEL(DEGREE 2);
其执行计划为:
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2990439629
----------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------
| 0 | CREATE INDEX STATEMENT | | 328 | 4264 | 2 (0)| 00:00:01 | | | | | |
| 1 | PX COORDINATOR | | | | | | | | | | |
| 2 | PX SEND QC (ORDER) | :TQ10001 | 328 | 4264 | | | | | Q1,01 | P->S | QC (ORDER) |
| 3 | INDEX BUILD NON UNIQUE| ID1 | | | | | | | Q1,01 | PCWP | |
| 4 | SORT CREATE INDEX | | 328 | 4264 | | | | | Q1,01 | PCWP | |
| 5 | PX RECEIVE | | 328 | 4264 | 2 (0)| 00:00:01 | | | Q1,01 | PCWP | |
| 6 | PX SEND RANGE | :TQ10000 | 328 | 4264 | 2 (0)| 00:00:01 | | | Q1,00 | P->P | RANGE |
| 7 | PX BLOCK ITERATOR | | 328 | 4264 | 2 (0)| 00:00:01 | 1 | 4 | Q1,00 | PCWC | |
| 8 | TABLE ACCESS FULL| DEPT | 328 | 4264 | 2 (0)| 00:00:01 | 1 | 4 | Q1,00 | PCWP | |
----------------------------------------------------------------------------------------------------------------------------------
Note
----
- estimated index size: 65536 bytes
19 rows selected
从例子中可用看出创建表这个操作被分割成了若干个子操作,其中的子操作8先执行,他是被4个执行服务器并行的执行,然后子操作7 6 5 4 3 2也都是被并行执行的,最终执行子操作1,总协调进程收集所有并行执行的结果反馈给用户查看。