1:进程
并行要用到两类进程,分别叫slave process和query coodinator。
slave process是由若干进程组成,这些进程地位相同,每个都负责一部分工作或一个工作单元。就全表扫描来说,每个slave process负责扫描segment的一部分,这样的一组进程也叫做一个ps set(parallel server set)。
query coodinator进程通常是发出sql语句的那个进程,这个进程负责把一个任务分解成若干个任务片,并申请ps set,为每个slave process指定工作片段,并收集每个slave process返回的处理结果并汇总成最终的结果返回给用户。
两种进程的角色可以这样理解,slave process是真正干活的进程,query coodinator只是指手画脚,负责协调,偶尔也会干点活的进程。
在并行架构中,query coodinator会把整个工作按照一定粒度(granules)划分成若干个单元,每个slave process会分配一个工作单元,slave process完成分配给他的单元后,如果还有剩余的工作单元,则会继续分配下一个,直到全部完成。
query coodinator划分工作单元的粒度有两种。
a:分区:如果对象是分区的,则工作单元可以以分区为单位进行划分。
b:数据块范围:每个工作单位是一个segment中的若干个数据块。
2:相关参数
执行如下语句得到和并行相关的一些参数:
SQL> show parameter parallel
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
parallel_adaptive_multi_user boolean TRUE
parallel_automatic_tuning boolean FALSE
parallel_execution_message_size integer 2152
parallel_instance_group string
parallel_max_servers integer 320
parallel_min_percent integer 0
parallel_min_servers integer 0
parallel_server boolean TRUE
parallel_server_instances integer 2
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0
一些重要参数的介绍:
parallel_max_servers
并行是通过slave process进程来完成的。并行进程在数据库范围内是共享使用的,所有的并行进程组成一个进程池(PX server pool),每当需要并行操作时,就会从这个池中取出足够的并行进程。完成操作时,就要把并行进程返回这个池中。parallel_max_servers这个参数就是控制数据库范围内并行进程的最大数量。
默认值为cpu数量×10。如果设置成0,则就相当与在数据库内禁用并行。
parallel_min_servers
parallel_min_servers参数定义了进程池中至少要保有的并行进程数量,数据库启动时这些进程就会启动,而且不管有没有并行操作用到也会一直运行。如果最小值达不到使用需求,则会动态增加进程数量,增加的进程数量如果在完成任务后5分钟内没有被再次使用,则会被关闭。这个参数的默认值为0,所以有时候使用时会等待一段时间才能看到使用,所以设置为非0时可以减少一部分的进程等待时间。
查看ps server使用状况
SQL> select * from v$px_process_sysstat where statistic like 'Servers%';
STATISTIC VALUE
-------------------------------------------------------------------------------- ----------
Servers In Use 0
Servers Available 3
Servers Started 2162
Servers Shutdown 2159
Servers Highwater 71
Servers Cleaned Up 0
6 rows selected
并行处理是一个性能加速器,但是如果使用不当,也会成为性能杀手。大量的并行会长时间占用资源,使得其他用户的操作根本没有执行的机会。因此需要对并行进行控制,数据库有两个参数与此相关
parallel_adaptive_multi_user
这个参数是自适应调节的开关,默认值为true,可选值false。设置false时对并行使用的并行进程不加限制。但是设置为true的话则会启动一个适应性并行算法,这个算法的结果就是平衡用户的并行请求和系统处理能力,这样就会在尽量满足并行的同时预留足够的资源以备其他的进程来使用。
parallel_min_percent
并行时如果并行度DOP已经确认,那么进程在运行期间并行度都不会改变。但是如果系统无法满足请求的并行度,oracle会悄悄的把并行度降低,甚至到串行处理。而该参数就是来限制oracle的这个悄悄的行为的。
该参数默认值为0,最大值为100,是百分比。
为0时允许oracle的悄然行动
为100时就意味的必须满足并行度才会操作,否则报错
中间的数字时就要求并行度比例必须大于等于这个值,否则不能运行
例如
设置parallel_adaptive_multi_user=false
设置parallel_max_servers =30
设置parallel_min_percent=100
设置表a的并行属性为100
这个时候执行表a上的查询,由于100×100%=100>30,所以该语句会报错ora-12827。
并行的相关降级状况用以下语句查询
SQL> select name,value from v$sysstat where name like 'Para%';
NAME VALUE
---------------------------------------------------------------- ----------
Parallel operations not downgraded 490954
Parallel operations downgraded to serial 0
Parallel operations downgraded 75 to 99 pct 0
Parallel operations downgraded 50 to 75 pct 0
Parallel operations downgraded 25 to 50 pct 0
Parallel operations downgraded 1 to 25 pct 0
6 rows selected
db_file_multiblock_read_count
这个参数决定了直接读取操作时每次读取的数据块数量,增加这个值可以更好的利用IO
SQL> show parameter db_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count integer 16
pga_aggregate_target
由于数据块是被读取到pga中进行操作,所以oracle建议这个值至少要等于100M×parallel_max_servers
换种说法就是parallel_max_servers值不能大于pga_aggregate_target/100M
SQL> show parameter pga_aggregate_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 3881M
并行操作对数据的读取一般会跳过buffer cache,直接读读取到pga中,除非对象在创建时候明确指定了cache属性,或者对象的数据量小于cache的2%。所以在并行执行前有个checkpoint动作把脏数据写到数据文件中,否则就会出现数据不一致的状况。
查询语句如下
SQL> select name,value from v$sysstat where name like '%DBWR%';
NAME VALUE
---------------------------------------------------------------- ----------
DBWR parallel query checkpoint buffers written 171721
DBWR checkpoints 37923
就对象大小使用并行,oracle给出建议如下
小于200m时不建议使用并行
200m-5G使用并行度4
超过5G的使用最大值32
就何操作可以使用并行,建议如下
全表扫描,全分区扫描,快速索引扫描(FFS)
对于索引的访问,索引必须是分区索引,每个分区只能被一个slave process访问
连接(join),排序(sort),聚集(aggregration),集合操作(set operation)
3:启用并行说明
并行的使用分为三种,分别针对对象,语句,会话
对象级别
并行属性在创建的时候可以指定,针对表和索引
create table yu_test (t1 number ,t2 varchar2(10)) parallel 4;
查看select × from yu_test 的执行计划,如下:
SELECT STATEMENT, GOAL = ALL_ROWS 耗费=2 基数=1 字节=20
PX COORDINATOR
PX SEND QC (RANDOM) 对象所有者=SYS 对象名称=:TQ10000 耗费=2 基数=1 字节=20
PX BLOCK ITERATOR 耗费=2 基数=1 字节=20
TABLE ACCESS FULL 对象所有者=SYS 对象名称=YU_TEST 耗费=2 基数=1 字节=20
从=:TQ10000 可以看出使用了并行
针对索引
create index idvvv on yu_test (t1) parallel 4;
创建完毕后修改并行属性
alter table yu_test parallel 4;
alter index idvvv parallel 4;
取消并行属性
alter table yu_test parallel 1;
alter table yu_test noparallel ;
alter index idvvv parallel 1;
alter index idvvv noparallel ;
查看对象并行属性状况
select degree from dba_tables where table_name='YU_TEST';
select degree from dba_indexes where index_name='IDVVV';
语句级别
就是通过优化器提示来让语句能够使用并行处理。
实例:
select /*+ parallel (yu_test 2)*/ * from yu_test;
对表实行并行度为2的并行处理。
select /*+ no_parallel (yu_test )*/ * from yu_test
对表禁止并行处理
索引的就是no_parallel和no_parallel_index
会话级别
会话范围开启关闭并行查询:
alter session enable parallel query;
alter session disable parallel query;
alter session force parallel query parallel 4;
会话范围开启关闭并行dml:
alter session enable parallel dml;
alter session disable parallel dml;
alter session force parallel dml parallel 4;
会话范围开启关闭并行ddl:
alter session enable parallel ddl;
alter session disable parallel ddl;
alter session force parallel ddl parallel 4;
查看session当前并行状况的语句:
SQL> select pdml_status,pddl_status,pq_status from v$session where sid=(select distinct sid from v$mystat);
PDML_STATUS PDDL_STATUS PQ_STATUS
----------- ----------- ---------
FORCED FORCED FORCED