oracle动态采样导致数据库出现大量cursor pin s wait on x等待
生产库中,突然出现了大量的cursor pin s wait on x等待,第一反应是数据库出现了硬解析,查看最近的DDL语句,没有发现DDL。那么有可能这个sql是第一次进入
在OLTP高并发下产生硬解析,导致出现大量等待。但是,此次 发现等待时间很长,远远超过硬解析应该有的时间,再次分析后发现是动态采样的问题。
动态采样:在表没有统计信息或者SQL中有临时表是会发生
生产库环境:统计信息收集关闭,新建的表从来没有收集过统计信息也没有导入统计信息,并且表都很大(一百多G)
原因:因为表没有统计信息,因此SQL第一次后硬解析是会发生动态采样,但是表很大,导致动态采样的时间很长
解决方法:
1.加hint
select /*+dynamic_sampling(dysam 0)*/* from dysam where id=10;
2.关闭数据库的动态采样
alter system set optimizer_dynamic_sampling = 0;
关闭数据库动态采样要注意,每个SQL都有HINT,不然关闭后,执行计划可能会是错误的。