Oracle统计信息引起的性能问题

今天一个朋友和我说他管理的系统早上CPU压力比较大,让我帮忙看看,我首先看了awr报告,里面一个sql引起了我的注意,如下:


  1. 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 */
  2.  NVL(SUM(C1), :"SYS_B_00"), NVL(SUM(C2), :"SYS_B_01")
  3.   FROM (SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("T") FULL("T") NO_PARALLEL_INDEX("T") */
  4.          :"SYS_B_02" AS C1,
  5.          CASE
  6.            WHEN "T"."DEVICE_ID" = :"SYS_B_03" AND
  7.                 "T"."VISIT_TYPE" = :"SYS_B_04" AND
  8.                 "T"."SIGN_OUT_TIME" >=
  9.                 "MAxxx"."MAxxx_DATE_TO_UTC"(TO_DATE(:"SYS_B_05",:"SYS_B_06")) AND"T"."SIGN_OUT_TIME" <=
  10.                 "MAxxx"."MAxxx_DATE_TO_UTC"(TO_DATE(:"SYS_B_07",:"SYS_B_08")) THEN :"SYS_B_09" ELSE :"SYS_B_10" END AS C2
  11.           FROM "MAxxx"."V800000" SAMPLE BLOCK(:"SYS_B_11 ", :"SYS_B_12") SEED(:"SYS_B_13") "T") SAMPLESUB
能看出来这个sql,是实例在对表进行动态采样,难道 V800000没有统计信息吗? 来看一下


  1. SQL> SELECT table_name,last_analyzed,status,partitioned FROM dba_tables WHERE table_name='V800000' AND owner='MAxxx';

  2. TABLE_NAME         LAST_ANALYZED     STATUS PAR
  3. ------------------------------ ------------------- -------- ---
  4. V800000         2017-10-08 20:49:56 VALID YES
可以看到这个表的统计信息是很新的,然后这个表是一个分区表,比较奇怪的是,为啥是晚上8点多收集的统计信息,正常应该是10点之后,经询问朋友得知,对于系统里的一些核心表,他都是经常手动收集的

问了他要了手动执行的语句:

  1. 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/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值