在性能优化艺术一书中看到:
Joze Senegacnik指出,从Oracle 10gR2开始,可以通过如下这个公式计算出访问一个列的CPU开销。
cpu_cost = column_position * 20
公式:估算访问一个列的CPU开销跟这个列在表中的位置有关。这个公式给出了访问一行所用的开销。如果访问多行数据,CPU开销按比例增加(为什么会增加,后续再研究~)。
下面一个实验证明一下:
创建一张表t1,插入一行记录,运行explain plan得到执行计划,获取依次取出第一列到第九列的CPU开销。
SQL> create table t1 (
2 c1 number,
3 c2 number,
4 c3 number,
5 c4 number,
6 c5 number,
7 c6 number,
8 c7 number,
9 c8 number,
10 c9 number);
Table created.
SQL> insert into t1 values (1,2,3,4,5,6,7,8,9);
1 row created.
SQL> explain plan set statement_id 'c1' for select c1 from t1;
SQL> explain plan set statement_id 'c2' for select c2 from t1;
SQL> explain plan set statement_id 'c3' for select c3 from t1;
SQL> explain plan set statement_id 'c4' for select c4 from t1;
SQL> explain plan set statement_id 'c5' for select c5 from t1;
SQL> explain plan set statement_id 'c6' for select c6 from t1;
SQL> explain plan set statement_id 'c7' for select c7 from t1;
SQL> explain plan set statement_id 'c8' for select c8 from t1;
SQL> explain plan set statement_id 'c9' for select c9 from t1;
SQL> select statement_id,cpu_cost as total_cpu_cost,
2 cpu_cost-lag(cpu_cost) over (order by statement_id) as cpu_cost_1_coll,
3 io_cost
4 from plan_table
5 where id=0
6 order by statement_id;
STATEMENT_ID TOTAL_CPU_COST CPU_COST_1_COLL IO_COST
------------------------------ -------------- --------------- ----------
c1 35757 3
c2 35777 20 3
c3 35797 20 3
c4 35817 20 3
c5 35837 20 3
c6 35857 20 3
c7 35877 20 3
c8 35897 20 3
c9 35917 20 3
9 rows selected.
请注意,初始读取表数据的CPU开销是35757,每往后面一列,CPU开销加20。同时I/O开销不变,这是因为所有列的数据基本存储在同一个数据块,全部查询的物理读的次数是一样的。
摘录、参考于Oracle性能诊断艺术
Ligle WANG
2011-11-10
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25834554/viewspace-710781/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25834554/viewspace-710781/