CPU成本高但IO成本低的原因是什么?

时间:2016-02-04 09:35:21

标签: oracle sqlperformance sql-execution-plan

enter image description here

我正在一个只有283条记录的表上运行查询。查询将进行全表扫描,因为谓词中没有传递索引列值。

成本仅为12,但CPU成本非常高--4,75,189。

即使表中没有任何记录,CPU成本高的原因是什么?

成本与成绩之间的区别是什么? CPU成本?

PL SQL开发人员用作IDE。

查询 - :

SELECT     qmh_client, qmh_ip_timestamp, qmh_plant, qmh_key_tsklst_grp,
           qmh_grp_cntr, qmh_valid_dt, qmh_tdc_desc, qmh_cert_std,
           qmh_tsklst_usage, qmh_statu, qmh_lot_size_from, qmh_lot_size_to,
           qmh_tl_usage_uom, qmh_ctyp, qmh_cp_no, qmh_cp_version, qmh_tdform,
           qmh_ref_tdc, qmh_licn_no, qmh_guege_len, qmh_ip_activity,
           qmh_cp_activity, qmh_ip_sts_code, qmh_cp_sts_code, qmh_ltext_act,
           qmh_ltxt_sts_code, qph_ip_id, qmh_ip_mess, qmh_cp_id, qmh_cp_mess,
           qmh_rfd, qmh_smtp_addr, qmh_crt_time, qmh_crt_date, qmh_crt_by,
           qmh_ip_upd_time, qmh_ip_upd_date, qmh_ip_upd_by, qmh_cp_upd_time,
           qmh_upd_date, qmh_cp_upd_by, qmh_clas_sts_code, qmh_clas_id,
           qmh_clas_mess, qmh_clas_upd_time, qmh_clas_upd_date,
           qmh_clas_upd_by, qmh_prd_ind, qmh_tdc_type, qmh_pi_status
      FROM ipdmdm.t_qm_insp_hdr
     WHERE qmh_pi_status = 'N'
FOR UPDATE

2 个答案:

答案 0 :(得分:1)

根据Mongoose documentation,CPU_COST和IO_COST以不同方式测量。 IO_COST与操作读取的数据块数成比例,#CPU; CPU_COST"与操作所需的机器周期数成比例"。

成本之间的差异不应该太令人惊讶,因为许多数据库操作需要比磁盘读取更多的CPU周期。在我的电脑上进行的简单测试产生了类似的结果:

    public List getKeyNames(){
    try {
        SAXBuilder builder = new SAXBuilder();
        Document document = builder.build(f);

        List keyNameList = new ArrayList();
        List keyList = new ArrayList();

        Element keystore = document.getRootElement();
        keyList = keystore.getChildren("key");
        for(int i=0; i<=keyList.size(); i++) {
            keyNameList.add((keyList.get(i)).getAttribute("name").getValue());
        }
        return keyNameList;
    } 
    catch (JDOMException e) {
        e.printStackTrace();
    }         
    catch(IOException e){
        e.printStackTrace();
        System.out.println(e.getMessage());
    } 
    return null;
}

即使它被称为基于 Cost 的优化器,但在评估执行计划时,成本通常也不是一个有用的指标。 &#34;操作&#34;和&#34;行&#34;列更有用。

此外,如果您对解释计划感兴趣,请停止使用IDE的残缺视图,并使用Oracle提供的文本版本。使用create table test1(a char(1000)); insert into test1 select level from dual connect by level <= 283; begin dbms_stats.gather_table_stats(user, 'TEST1'); end; / explain plan set statement_id = 'cost test' for select * from test1 for update; select cpu_cost, io_cost from plan_table where statement_id = 'cost test' and id = 0; CPU_COST IO_COST -------- ------- 348672 13 explain plan for select ...。 PL / SQL Developer是一个很棒的工具,但它的解释计划窗口缺少关键信息(Notes部分)并且有一些错误(它不包括会话设置)。

答案 1 :(得分:0)

检查this

  

COST :优化程序查询估算的操作成本   做法。未确定表访问操作的成本。该   该栏的价值没有任何特定的计量单位;   它只是用于比较执行成本的加权值   计划。此列的值是CPU_COST和的函数   IO_COST列。

     

CPU_COST :查询估计的操作的CPU成本   优化器的方法。此列的值与   操作所需的机器周期数。对于陈述   使用基于规则的方法,此列为空。

您可以参阅此文章以了解What is the cost column in an explain plan?

  

取决于您的版本和隐藏参数的设置   _optimizer_cost_model(cpu或io),成本来自计划表中的cpu_cost和io_cost列(反过来,来自   sys.aux_stats $。 “成本”列不是任何特定单位   测量,它是从中得出的成本的加权平均值   带来SQL语句时生成的基于成本的决策树   处理。 cost列基本上是运行时的估计值   对于给定的操作。