- 最后登录
- 2017-5-4
- 在线时间
- 81 小时
- 威望
- 999
- 金钱
- 2391
- 注册时间
- 2013-9-11
- 阅读权限
- 150
- 帖子
- 1124
- 精华
- 5
- 积分
- 999
- UID
- 1220
|
1#
发表于 2013-10-7 21:18:32
|
查看: 3363 |
回复: 0
Oracle 并行查询调优parallel query
Oracle 并行查询主要用于数据仓库类型的数据库,Oracle 并行查询(OPQ)可以将一个SQL分成多个片,然后在独自的CPU上通过多个process进行并行运行。
典型的应用是:full table scans, creating or rebuilding an index ,one or more partitions of an index,Partition operations such as moving or splitting partitions,CREATE TABLE AS SELECT operations if the SELECT involves a full table or partition scan 。INSERT INTO . . . SELECT operations, if the SELECT involves a full table or partition scan ,Update
and delete operations on partitioned tables,sorts, sub_queries, data loading等。
大量使用Oracle 并行查询,将消耗更多的CPU,对于CPU消耗比较高的系统而言,需要控制并行查询的并发规模。
并行查询规模相关的参数调整
与并行查询规模相关的参数,主要有下面几个:
PARALLEL_MIN_SERVERS
PARALLEL_MAX_SERVERS
PARALLEL_AUTOMATIC_TUNING=TRUE (ORACLE会尽量使用PARALLEL)
PARALLEL_MIN_SERVERS缺省值是0,PARALLEL_MAX_SERVERS
是CPU的10倍,在CPU使用率很高并且是因为大量的并行查询导致的,可以通过调整PARALLEL_MAX_SERVERS来缓解CPU的使用压力
多个级别的并行查询调整
也可以在OBJECT、STATEMENT、TABLE等各个级别来控制并发程度。
OBJECT级启用OPQ:
ALTER TABLE /INDEX XXX PARALLEL (DEGREE 8)
OR
STATEMENT级
SELECT --+ PARALLEL (table_alias, degree, nodes) from table …..
或/*+ FULL(emp) PARALLEL(table_alias, 35) */
表级停止OPQ:
ALTER TABLE/INDEX XXX PARALLEL (DEGREE 1 INSTANCES 1)
OR
ALTER TABLE/INDEX XXX NOPARALLEL;
Paralle Query并不一定是最好的,尤其是武断的把所有TABLE都设置成Paralle Query更是危险的,因为CBO会改变评估标准而尽量使用parallel full-table scans而不是index scans。
并行查询监控
可以通过下面的视图来监控并行查询:
select * from v_$pq_sysstat;
select * from v_$px_process;
select * from v_$px_sesstat;
select * from v_$px_process_sysstat;
并行跨实例运行
建议一般情况下并行查询限制在实例内,这可以通过INSTANCE_GROUPS、PARALLEL_INSTANCE_GROUPS参数来实现.
比如在节点1上设置:
rac1.Instance_groups=rac1,rac
Rac1.Parallel_instance_group=rac1
在节点2上设置:
Rac2.Instance_groups=rac2,rac
Rac2.Parallel_instance_group=rac2
通过这些参数的设置,在缺省环境下,并行查询只能在实例内进行。因为每个实例的缺省PARALLEL_INSTANCE_GROUP都是实例名,只有本实例的instance_groups参数中包含和本实例名相同的instance_group。而如果我们想要让某个SQL跨实例做并行查询的时候,可以通过下面的方法进行:
Alter session set parallel_instance_group='rac';
Select ....
由于两个实例都属于rac instance_group,所以只要parallel_instance_group设置为‘rac’就可以了。
|
|