摘自《VLDB and Partitioning Guide》
系统参数中直接涉及到参数,见Table 8-3,包括每个参数的缺省值。这些参数的缺省值,依赖于数据库启动时的参数CPU_COUNT 和 PARALLEL_THREADS_PER_CPU。这些参数可手工调整,增加或减少它们的值以适应系统配置需要或性能目标,比如:
- 对于不需要并行执行的系统,参数PARALLEL_MAX_SERVERS可设置为0。
- 对于拥有充裕SGA内存的系统,可增加PARALLEL_EXECUTION_MESSAGE_SIZE参数的值以改善吞吐量。
注:上述并行相关参数可能还受限于其它系统参数。比如,如果PROCESSES参数设置为20,那么系统不可能获取25个并行服务器子进程,即使PARALLEL_MAX_SERVERS参数设置为25。
PARALLEL_FORCE_LOCAL
这个参数设置是否将并行执行语句限定在RAC环境中的单实例上。设置此参数为TRUE,则会将并行服务器限制在并行协调器所在的实例上运行。缺省值为FALSE。
PARALLEL_MAX_SERVERS
缺省值为:
PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5
其中:concurrent_parallel_users值依赖于内存管理方式。如果禁用自动内存管理,concurrent_parallel_users取值为1;如果启用PGA自动内存管理,concurrent_parallel_users取值为2;如果启用全局内存管理或SGA内存管理(除了启用PGA自动内存管理之外),concurrent_parallel_users取值为4。
对于要求并行度比较高的情况,也可设置为:
2 x DOP x NUMBER_OF_CONCURRENT_USERS
举例来说,如果每个查询允许使用两组并行服务器且DOP为8,设置此参数为64则允许系统同时并行运行4条查询语句。
何时增加PARALLEL_MAX_SERVERS值:系统拥有充足内存和IO带宽,方可增加此参数值。通过性能监控工具观察系统有多少空闲的内存、SWAP空间和IO带宽,观察CPU和磁盘的队列长度,IO操作的服务时间。限制并行服务器的数量,可能会限制并发用户的数量(可能运行并行语句),但这样会让系统更稳定。
使用消费者组限制一个并发用户的资源使用数量。具体方式就是:为这个用户设置消费者组,然后为这个消费者组设置并行度。
PARALLEL_MIN_PERCENT
这个参数(大于0时)可以让并发用户等待一个可接受的DOP,如果一定时间内系统满足要求的并行服务器数量,系统会提示报错:ORA-12827: insufficient parallel query slaves available。
此参数默认值为0,意味着:如果没有足够数量的并行服务器,则直接转为串行执行,不会报ORA-12827错误。
PARALLEL_MIN_SERVERS
可以用这个参数设置单个实例启动时一起启动的并行服务器。这些并行服务器,一直存在,直到数据库实例关闭。
PARALLEL_MIN_TIME_THRESHOLD
这个参数用来设定SQL语句考虑AUTO DOP时需要满足的最小执行时间。这个最小执行时间,是系统评估出来的。默认为10秒,即只有执行时间超过10秒的语句才会考虑AUTO DOP。另外,这个参数也只有启用AUTO DOP才会生效,即只有参数PARALLEL_DEGREE_POLICY设置为AUTO或LIMITED才会生效。
PARALLEL_SERVERS_TARGET
这个参数用来设定SQL语句排队前当前并行服务器数量的最大值。默认值为:
PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2
其中concurrent_parallel_users计算方法见PARALLEL_MAX_SERVERS参数部分。
当参数PARALLEL_DEGREE_POLICY为AUTO时,如果当前系统的正在使用的并行服务器数量等于或超过PARALLEL_SERVERS_TARGET参数值,则后续SQL语句会进入队列等候。这个参数的主要出发点就是防止过度使用并行服务器,导致系统性能过载。
SHARED_POOL_SIZE
并行执行需要额外的内存,除了需要同串行执行一样的内存资源之外。这些额外的内存,用于查询服务器、查询协调器之间的沟通和传输数据。
数据库从SHARED_POOL中为并行服务器分配内存。调优的主要规则如下:
1)首先为共享池的其它用户考虑,比如游标、存储过程等;
2)谨记多用户环境中大一点的值能够改善性能,而小一点的值则节省内存;
3)你可以监测到并行执行使用的buffer数量,然后将large pool中PX msg pool值与V$PX_PROCESS_SYSSTAT中的并行使用过的最大buffer数量(Buffers HWM)进行比较。
举例如下:
1)执行SQL查询large pool中PX msg pool值
SELECT POOL, NAME, SUM(BYTES) FROM V$SGASTAT WHERE POOL LIKE ‘%pool%‘
GROUP BY ROLLUP (POOL, NAME);
POOL NAME SUM(BYTES)
large pool PX msg pool 38092812
2)
SELECT * FROM V$PX_PROCESS_SYSSTAT WHERE STATISTIC LIKE ‘Buffers%‘;
STATISTIC VALUE
------------------- -----
Buffers Allocated 23225
Buffers Freed 23225
Buffers Current 0
Buffers HWM 3620
3)当前使用的内存buffer数可通过Buffers Current 和 Buffers HWM统计信息获得。此数量乘以PARALLEL_EXECUTION_MESSAGE_SIZE参数值,即为使用的内存字节数。用高水位内存字节数,同PX msg pool值进行比较,以此来判断你分配的内存是否过大还是过小。上面的px msg pool值为38092812,即38MB。Buffers HWM值为3620,乘以PARALLEL_EXECUTION_MESSAGE_SIZE参数值,4096,等于14827520,即15MB。并行缓冲区高水位占用分配内存数量的40%。
PGA_AGGREGATE_TARGET
使用PGA_AGGREGATE_TARGET参数可以控制process的使用内存大小,也可以控制process的数量。同时设置PGA_AGGREGATE_TARGET和MEMORY_TARGET参数,可以继续启用自动调优,但当PGA_AGGREGATE_TARGET低于指定值时不被调整。
PARALLEL_EXECUTION_MESSAGE_SIZE
此参数指定并行执行使用的buffer大小。缺省值依赖于操作系统平台,大多数为16K,此值可满足绝大多数应用系统的需要。
TRANSACTIONS
对于并行DML和DDL来说,每个并行服务器都会启用一个事务。并行执行协调器使用二阶段提交协议来提交一个事务,因此,事务数量随着DOP的增加而增加。所以,在并行执行情况下,你可能需要增加TRANSACTIONS参数的值。
这个参数用来指定最大并发事务数。缺省情况下未考虑并行。比如,你有一个并行语句,DOP为20,系统就会有20个新的事务(如果有2个并行服务器组,则会有40个新事务)和1个协调器事务。这种情况下,你就应该将TRANSACTIONS参数值加上21或41。如果未显式设置此参数,默认为1.1 x SESSIONS。
FAST_START_PARALLEL_ROLLBACK
如果系统崩溃时有未提交的并行DML和DDL事务,设置此参数可以加速事务的恢复速度(系统重新启动时)。这个参数决定了事务恢复的DOP。这个参数的缺省值为CPU_COUNT参数值的2倍。如果缺省值不满足要求,则可以将这个参数设置为HIGH(CPU_COUNT参数值的4倍)。
DML_LOCKS
这个参数设置DML锁的最大数量。它的值应该等于所有用户下所有表上锁的数量。并行DML的锁数量,完全不同于串行DML。并行DML需要更多的锁,所以需要增加DML_LOCKS参数值。
Table 8–4列出了不同类型的并行DML语句其并行协调器、并行服务器需要的锁情况。可以根据这个信息,决定如何设置这个参数值。
比如,有一个600个分区的表,DOP为100。假设所有分区都涉入并行UPDATE或DELETE语句且不存在行移植。那么,
并行协调器将获得:
1 table lock SX
600 partition locks X
并行服务器将获得:
100 table locks SX
600 partition locks NULL
600 partition-wait locks S
DB_CACHE_SIZE
当你执行并行update、merge或delete时,buffer cache的行为就好像OLTP系统中执行大量的UPDATE操作一样。
DB_BLOCK_SIZE
建议使用大一点的值,比如8 KB 或 16 KB。
DB_FILE_MULTIBLOCK_READ_COUNT
这个参数决定了一次操作系统“读”能够读取的数据库块数。它的默认值是最大的IO大小,依赖于具体系统平台(对于大多数平台来说,这个值为1M)。如果DB_FILE_MULTIBLOCK_READ_COUNT参数设置地过高,数据库启动时会将此参数调降为最大IO大小。
DISK_ASYNCH_IO 和 TAPE_ASYNCH_IO
建议这两个值为TRUE。
这两个参数可以启用操作系统的异步IO功能。它们允许在执行表扫描时同时进行IO请求和CPU处理。如果操作系统允许异步IO,建议设置这些参数为TRUE。Figure 8–6描述了异步读是如何工作的。
异步操作支持并行表扫描、HASH连接、排序和串行表扫描。这个特性要求操作系统的配置,可能会不支持某些系统平台。