以下查询给DB CPU利用率带来影响,我可以减少表中的数据将帮助我降低DB CPU性能

时间:2013-03-13 05:57:58

标签: oracle oracle11g

我正在使用以下查询,其中,正在被引用的表具有50Million +记录。通过创建历史表将帮助我提高CPU性能?或者除了分区之外还有其他选择吗?或者查询计划调整是唯一的选择吗?

SELECT MIN(minbkt),
       maxbkt,
       SUBSTRB(DUMP(MIN(val), 16, 0, 32), 1, 120) minval,
       SUBSTRB(DUMP(MAX(val), 16, 0, 32), 1, 120) maxval,
       SUM(rep) sumrep,
       SUM(repsq) sumrepsq,
       MAX(rep) maxrep,
       COUNT(*) bktndv,
       SUM(CASE
               WHEN rep = 1 THEN
                1
               ELSE
                0
           END) unqrep
  FROM (SELECT val,
               MIN(bkt) minbkt,
               MAX(bkt) maxbkt,
               COUNT(val) rep,
               COUNT(val) * COUNT(val) repsq
          FROM (SELECT
                /*+ no_parallel(t) no_parallel_index(t) dbms_stats cursor_sharing_exact use_weak_name_resl dynamic_sampling(0) no_monitoring */
                 "VERSION_LABEL" val,
                 NTILE(75) OVER(ORDER BY NLSSORT("VERSION_LABEL", 'NLS_SORT = binary')) bkt
                  FROM "User"."AUDITTRAIL" t
                 WHERE "VERSION_LABEL" IS NOT NULL)
         GROUP BY val)
 GROUP BY maxbkt
 ORDER BY maxbkt

1 个答案:

答案 0 :(得分:2)

看起来这是一个与在审核表的version_label列上收集直方图相关的查询。

我希望您几乎肯定不需要这样的直方图,并且您可以修改统计信息收集以仅收集此类表上的简单统计信息 - 即。没有直方图。这样做的最佳方式将取决于您的版本以及触发统计信息收集的方式,但如果您需要帮助,请展开问题以包含这些详细信息或启动其他问题。