今天一个朋友和我说他管理的系统早上CPU压力比较大,让我帮忙看看,我首先看了awr报告,里面一个sql引起了我的注意,如下:
能看出来这个sql,是实例在对表进行动态采样,难道
V800000没有统计信息吗?
来看一下
可以看到这个表的统计信息是很新的,然后这个表是一个分区表,比较奇怪的是,为啥是晚上8点多收集的统计信息,正常应该是10点之后,经询问朋友得知,对于系统里的一些核心表,他都是经常手动收集的
问了他要了手动执行的语句:
看到这个语句,就知道问题所在了,因为这个表是分区表,收集统计信息不是这样收集的,参数不对,我给他写了一个语句:
待系统闲时重新收集 后问题解决。
- SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */
- NVL(SUM(C1), :"SYS_B_00"), NVL(SUM(C2), :"SYS_B_01")
- FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("T") FULL("T") NO_PARALLEL_INDEX("T") */
- :"SYS_B_02" AS C1,
- CASE
- WHEN "T"."DEVICE_ID" = :"SYS_B_03" AND
- "T"."VISIT_TYPE" = :"SYS_B_04" AND
- "T"."SIGN_OUT_TIME" >=
- "MAxxx"."MAxxx_DATE_TO_UTC"(TO_DATE(:"SYS_B_05",:"SYS_B_06")) AND"T"."SIGN_OUT_TIME" <=
- "MAxxx"."MAxxx_DATE_TO_UTC"(TO_DATE(:"SYS_B_07",:"SYS_B_08")) THEN :"SYS_B_09" ELSE :"SYS_B_10" END AS C2
- FROM "MAxxx"."V800000" SAMPLE BLOCK(:"SYS_B_11 ", :"SYS_B_12") SEED(:"SYS_B_13") "T") SAMPLESUB
- SQL> SELECT table_name,last_analyzed,status,partitioned FROM dba_tables WHERE table_name='V800000' AND owner='MAxxx';
-
- TABLE_NAME LAST_ANALYZED STATUS PAR
- ------------------------------ ------------------- -------- ---
- V800000 2017-10-08 20:49:56 VALID YES
问了他要了手动执行的语句:
- EXECUTE dbms_stats.gather_table_stats (ownname=>'MAxxx', tabname=>'V800000',estimate_percent=>20,cascade=>true,degree => 10);
EXECUTE dbms_stats.gather_table_stats(ownname=>'MAxxx', tabname=>'V800000', partname=>null,estimate_percent=>25,method_opt=>'FOR ALL COLUMNS SIZE 1',granularity=>'ALL',cascade=>TRUE,degree=>10);
待系统闲时重新收集 后问题解决。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20893244/viewspace-2145758/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/20893244/viewspace-2145758/