我正在一个只有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
答案 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列基本上是运行时的估计值 对于给定的操作。