我们创建索引的时候,可以启用并行,来加快速度,例如:
访问有并行度的索引时,CBO可能可能会考虑并行执行,这可能会引发一些问题,
如在服务器资源紧张的时候用并行会引起更加严重的争用.
当使用并行后,需要把并行度改回来,例如:
设置并行度:
alter table table_name parallel ; ---修改并行度为默认值
declare n number
begin
commit;
end;
/
并行概念
并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理.
并行包括:
并行查询:这是指能使用多个操作系统进程或线程来执行一个查询.Oracle会发现能并行执行的操作(如全表扫描或大规模排序),并创建一个查询计划来实现).
并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE).
并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL操作.例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理.
并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间.
过程并行化:这是指能并行地运行所开发的代码.
何时使用并行
在应用并行执行之前,需要保证以下两点成立:
如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行.
如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间.
并行查询
并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案.
在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件.
各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel
query,PQ)从属进程.各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库.每个并行执行服务器分别负责扫描表中一个部分(各
个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案.
在默认情况下,Oracle是不启用并行查询的.启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等.
【并行查询方法】
①.)暗示hints式,临时有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表关联时多表并行:
alter table table_name parallel num;
alter session force parallel query parallel num;
alter session enable parallel dml;
对于前两种方式,若省略num则Oracle将自动根据负载确定并行度.并行度要随着系统上工作负载的增减而变化.如果有充足的空闲资源,并行度会
上升;如果可用资源有限,并行度则会下降.这样就不会为机器强加一个固定的并行度.利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源
量.
【查看默认并行数】
①.)确定会话SID
select sid from v$mystat where rownum = 1;
select sid,qcsid,server#,degree from v$px_session where qcsid = num;
一般而言,如果能访问尽可能多的资源(CPU、内存和I/O),并行执行就能最好地发挥作用.但这并不是说如果整个数据集都在一个磁盘上,就从并行
查询得不到任何好处.不过如果整个数据集都在一个磁盘上,可能确实不如使用多个磁盘那样能有更多收获.即使使用一个磁盘,在响应时间上也可能可以得到一定
的速度提升.原因在于:给定的一个并行执行服务器在统计行时并不读取这些行,反之亦然.所以,与执行串行相比,两个并行执行服务器可以在更短的时间内完成
所有行的统计.
数据分布在多个物理设备上可以提高I/O,如表分区、跨磁盘等.
Statement
Queuing,PSQ).使用PSQ时,数据库会限制并发执行的并行查询数,并把更多的并行请求放在一个执行队列中.CPU资源用尽时数据库会阻止新的
请求变为活动状态.这些请求并没有失败,它们只是会延迟开始,也就是说它们将排队.资源可用时,数据库就会开始执行队列中的查询.
并行DML
Oracle文档将并行DML(PDML)一词的范围限制为只包括INSERT、UPDATE、DELETE和MERGE(不像平常的DML那样还
包括SELECT).在PDML期间,Oracle可以使用多个并行执行服务器来执行INSERT、UPDATE、DELETE或MERGE,而不是只利
用一个串行进程.在一个有充足I/O带宽的多CPU主机上,对于大规模的DML操作,可能会得到很大的速度提升.
不过,不能把PDML当成提高OLTP应用速度的一个特性.因为并行操作设计为要充分、完全地利用一台机器上的所有资源.通过这种设计,一个用户可
以完全使用机器上的所有磁盘、CPU和内存.在某些数据仓库中(有大量数据,而用户很少),这可能正是你想要的.而在一个OLTP系统中(大量用户都在做
很短、很快的事务),可能就不能希望如此了,你不想让用户能够完全占用机器资源.
由于PDML采用的一种伪分布式的实现,所以呢存在一些限制:
PDML操作期间不支持触发器.这是一个很合理的限制,因为触发器可能会向更新增加大量开销,而你使用PDML的本来目的是为了更快一些,这两方面是矛盾的,不能放在一起.
PDML期间,不支持某些声明方式的引用完整性约束,因为表中的每一片(部分)会在单独的会话中作为单独的事务进行修改.例如,PDML操作不支持自引用完整性.如果真的支持自引用完整性,可能会出现死锁和其他锁定问题.
在提交或回滚之前,不能访问用PDML修改的表.
PDML不支持高级复制(因为复制特性的实现要基于触发器).
不支持延迟约束(也就是说,采用延迟模式的约束).
如果表是分区的,PDML只可能在有位图索引或LOB列的表上执行,而且并行度取决于分区数.在这种情况下,无法在分区内并行执行一个操作,因为每个分区只有一个并行执行服务器来处理.
执行PDML时不支持分布式事务.
PDML不支持聚簇表.
并行DDL
从维护的观点看,以及从管理的角度来说,并行DDL才是Oracle中并行执行最突出的优点.如果认为并行查询主要是为最终用户设计的,那么并行
DDL则是为DBA/开发人员设计的.如果没有并行执行,DBA将很难真正充分利用硬件的全部能力.但如果利用并行执行,则完全可以做到.以下SQL
DDL命令允许"并行化":
CREATE INDEX:多个并行执行服务器可以扫描表、对数据排序,并把有序的段写出到索引结构.
CREATE TABLE AS SELECT:执行SELECT的查询可以使用并行查询来执行,表加载本身可以并行完成.
ALTER INDEX REBUILD:索引结构可以并行重建.
ALTER TABLE MOVE:表可以并行移动.
ALTER TABLE SPLIT|COALESCE PARTITION:单个表分区可以并行地分解或合并.
ALTER INDEX SPLIT PARTITION:索引分区可以并行地分解.
并行DDL和使用外部表的数据加载
利用并行DDL,再加上外部表,就能通过一个简单的CREATE TABLE AS SELECT or INSERT /*+ APPEND
*/来实现并行直接路径加载.不用再编写脚本,不必再分解文件,也不用协调要运行的N个脚本.简单地说,通过结合并行DDL和外部表,不仅提供了纯粹的易
用性,而且全无性能损失.
并行DDL和区段截断
并行DDL依赖于直接路径操作.也就是说,数据不传递到缓冲区缓存以便以后写出;而是由一个操作(如CREATE TABLE AS
SELECT)来创建新的区段,并直接写入这些区段,数据直接从查询写到磁盘(放在这些新分配的区段中).每个并行执行服务器执行自己的部分CREATE
TABLE AS SELECT工作,并且都会写至自己的区段.INSERT /*+ APPEND
*/(直接路径插入)会在一个段的HWM"之上"写,每个并行执行服务器再写至其自己的一组区段,而不会与其他并行执行服务器共享.所以呢,如果执行一个并
行CREATE TABLE AS
另一个新的区段,并行执行服务器不会使用由其他并行执行服务器非品牌的区段.
在数据仓库环境中,执行一个大规模的加载之后,这可能导致"过渡浪费".假设你想加载1,010MB的数据(大约1GB),而且正在使用一个有
①.00MB区段的表空间,你决定使用10个并行执行服务器来加载这个数据.每个并行执行服务器先分配其自己的100MB区段(总共会有10个100MB的
区段),并在其中填入数据.由于每个并行执行服务器都要加载101MB的数据,所以它会填满第一个区段,然后再继续分配另一个100MB的区段,但实际上
trimming)就能派上用场了.Oracle会试图取每个并行执行服务器的最后一个区段,并将其"截断为"可能的最小大小.
区段截断和字典管理表空间
如果使用传统的字典管理表空间,Oracle可以把只包含1MB数据的各个100MB区段转变或1MB的区段.遗憾的是,(在字典管理的表空间中)
区段截断和本地管理表空间
本地管理表空间有两种类型:UNIFORM SIZE 和AUTOALLOCATE,UNIFORM
SIZE是指表空间中的每个区段大小总是完全相同;AUTOALLOCATE则表示Oracle会使用一种内部算法来确定每个区段应该是多大.这些方法都
能很好地解决上述问题,不过,这两种方法的解决策略截然不同.
随着使用并行直接路径操作向表UNIFORM_TEST加载越来越多的数据,过一段时间后,空间利用情况会变得越来越糟糕.对此,我们可能希望使用
一个更小的统一区段大小,或者使用AUTOALLOCATE.一段时间后,AUTOALLOCATE也可能生成更多的区段,但是由于会发生区段截断,所以
空间利用情况要好得多.
一般表数据量比较大(超过100万)时,可以使用parallel强制启动并行度来提升查询速度
用法:/*+parallel(table_short_name,cash_number)*/
可以加到insert、delete、update、select的后面来使用
效率是否得到提高,并不取决于你设置了多碉堡的参数,参数和参数值是否合适方为根本
并行需要成本,因为并行之前需对服务器资源综合权衡,计算并行,分配任务
并行设置是门艺术,因为PARALLEL经常是要跟FILESIZE,DUMPFILE一起考虑
下面是官方文档给的一个并行优化实例:
以上就是土嘎嘎小编为大家整理的oracle并行怎么设置相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!