6月份巡检中,石家庄Oracle数据库告警日志发现ORA-00020: maximum number of processes (300) exceeded,提取告警时间段的AWR,观察发现:
PX Deq: Slave Session Stats等待事件
观察sql统计信息发现insert-select并行的SQL语句,如下所示:
经过与开发核实,发现在一个存储过程包中,有10条insert-select并行sql语句,并且在存储过程的最后一个insert完成做提交。这导致并行SQL语句申请过多的进程,进而导致数据库进程数超过最大数。以下是配合开发在测试数据库做的insert-select并行测试。
当去掉/*+parallel*/时,通过观察oracle等待事件,没有发现任何并行的等待事件。
当设置/*+parallel 4*/时,通过观察oracle等待事件、进程,以及通过sql_id查找出的sql文本发现,在大部分情况下,oracle会小于4+1个进程数的方式运行sql,但是在很短的时间内,oracle启动的进程数仍有可能会大于限制的进程数。如下图,在开4个parallel的情况下,sql运行过程中也出现了启动了8个并行进程的时候。
后台捕获到的insert-select的sql语句:
insert-select(parallel 4 )时等待事件:
insert-select(parallel 4 )时,并行进程峰值有8个进程同时进行:
另外,经过实验验证:当insert-select(parallel)不加并行限制时,default情况下,并行数为cpu(个数)*parallel_threads_per_cpu(每个cpu允许的并行进程数),监控sql执行过程可以发现,在大部分情况下,oracle会小于16+1个进程数的方式运行sql,在很短的时间内,oracle启动的进程数可能会大于限制的进程数。
因此,在insert-select并行使用过程中,要结合数据库服务器CPU实际情况,对parallel做限制,防止进程数使用达到最大值而导致数据库服务不可用。另外oracle提供一个参数parallel_max_servers=n,即当前实例总共启动的并行服务进程不能超过这个参数的设定值。
观察sql统计信息发现insert-select并行的SQL语句,如下所示:
经过与开发核实,发现在一个存储过程包中,有10条insert-select并行sql语句,并且在存储过程的最后一个insert完成做提交。这导致并行SQL语句申请过多的进程,进而导致数据库进程数超过最大数。以下是配合开发在测试数据库做的insert-select并行测试。
当去掉/*+parallel*/时,通过观察oracle等待事件,没有发现任何并行的等待事件。
当设置/*+parallel 4*/时,通过观察oracle等待事件、进程,以及通过sql_id查找出的sql文本发现,在大部分情况下,oracle会小于4+1个进程数的方式运行sql,但是在很短的时间内,oracle启动的进程数仍有可能会大于限制的进程数。如下图,在开4个parallel的情况下,sql运行过程中也出现了启动了8个并行进程的时候。
后台捕获到的insert-select的sql语句:
insert-select(parallel 4 )时等待事件:
insert-select(parallel 4 )时,并行进程峰值有8个进程同时进行:
另外,经过实验验证:当insert-select(parallel)不加并行限制时,default情况下,并行数为cpu(个数)*parallel_threads_per_cpu(每个cpu允许的并行进程数),监控sql执行过程可以发现,在大部分情况下,oracle会小于16+1个进程数的方式运行sql,在很短的时间内,oracle启动的进程数可能会大于限制的进程数。
因此,在insert-select并行使用过程中,要结合数据库服务器CPU实际情况,对parallel做限制,防止进程数使用达到最大值而导致数据库服务不可用。另外oracle提供一个参数parallel_max_servers=n,即当前实例总共启动的并行服务进程不能超过这个参数的设定值。