[20250813]CPU COST转化为COST成本计算.txt --//别人问的问题,一开始我以为对方想知道CPU COST的计算,给对方看了以前的链接:[20190821]关于CPU成本计算.txt --//实际上需要了解知道CPU COST,如何转化为COST的成本,实际上CPU COST在大多数情况下占比很低。 --//跟踪看看10053很容易确定如何计算。 --//自己做一些尝试: 1.环境: SCOTT@book01p> @ver2 ============================== PORT_STRING : x86_64/Linux 2.4.xx VERSION : 21.0.0.0.0 BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production CON_ID : 0 PL/SQL procedure successfully completed. 2.顺便温习以前CPU COST部分计算: --//如果你看Jonathan Lewis的<基于成本的Oracle优化法则>,里面提到P51: Finding out exactly where the original count of 72,914,400 operations came from is much harder. If you care to run through a set of extremely tedious experiments, you could probably track it down—approximately—to details like these: . Cost of acquiring a block = X . Cost of locating a row in a block = Y . Cost of acquiring the Nth (in our case the 2nd) column in a row = (N - 1) * Z . Cost of comparing a numeric column with a numeric constant = A --//每块的CPU COST X=7121.44。 --//每行的CPU COST Y=150 --//每列的CPU COST Z=20,注意计算Highest_column_id --//谓词部分使用常量比较成本 A=50 ,引入函数比较成本 A=150 --//谓词部分使用绑定变量比较成本 A=150 --//扫描唯一索引块成本 1050。 --//写一个简单的例子验证看看: SCOTT@book01p> explain plan set statement_id='emp' for select * from emp; Explained. SCOTT@book01p> column time format 99999 SCOTT@book01p> column OPTIONS format a20 SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID='emp'; STATEMENT_ID OPERATION OPTIONS COST CPU_COST IO_COST TIME ------------------------------ ------------------------------ -------------------- ---------- ---------- ---------- ------ emp SELECT STATEMENT 3 39667 3 1 emp TABLE ACCESS FULL 3 39667 3 1 --//CPU_COST=39667 SCOTT@book01p> select blocks,num_rows from user_tables where table_name='EMP'; BLOCKS NUM_ROWS ---------- ---------- 5 14 --//占5块,14行。表一共8个字段。 --//以上查询相对简单,没有谓词部分,计算公式如下: --// X * blocks + Y * rows + Z * rows * (Highest_column_id - Lowest_column_id) --//7121.44 * blocks + 150*rows + 20*effect_rows* (Highest_column_id - Lowest_column_id) --//7121.44 * 5 + 150*14 + 20*14* (8-1) = 39667.20 --//计算结果非常接近。 3.看看CPU COST转化为COST成本: SCOTT@book01p> select * from emp; ... 14 rows selected. SCOTT@book01p> @ hash HASH_VALUE SQL_ID CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX SQL_EXEC_START SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 1745700775 a2dk8bdn0ujx7 1 83879 3956160932 680d47a7 2025-08-13 17:09:50 16777217 SCOTT@book01p> @ 10053x a2dk8bdn0ujx7 1 /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_4588_aa2dk8bdn0ujx7.trc --//查看跟踪文件内容: ----------------------------- SYSTEM STATISTICS INFORMATION ----------------------------- Using dictionary system stats. Using NOWORKLOAD Stats CPUSPEEDNW: 1512 millions instructions/sec (default is 100) IOTFRSPEED: 4096 bytes per millisecond (default is 4096) IOSEEKTIM: 10 milliseconds (default is 10) MBRC: NO VALUE blocks (default is 8) --//一般多数情况下很少有人会收集WORKLOAD状况。NOWORKLOAD表示没有WORKLOAD。 --//CPUSPEEDNW=1512,信息来源查询sys.aux_stats$: SYS@book01p> column PVAL2 format a20 SYS@book01p> select * from sys.aux_stats$; SNAME PNAME PVAL1 PVAL2 ------------------------------ ------------------------------ ---------- -------------------- SYSSTATS_INFO STATUS COMPLETED SYSSTATS_INFO DSTART 07-27-2021 20:33 SYSSTATS_INFO DSTOP 07-27-2021 20:33 SYSSTATS_INFO FLAGS 1 SYSSTATS_MAIN CPUSPEEDNW 1512.17698 SYSSTATS_MAIN IOSEEKTIM 10 SYSSTATS_MAIN IOTFRSPEED 4096 SYSSTATS_MAIN SREADTIM SYSSTATS_MAIN MREADTIM SYSSTATS_MAIN CPUSPEED SYSSTATS_MAIN MBRC SYSSTATS_MAIN MAXTHR SYSSTATS_MAIN SLAVETHR 13 rows selected. --------------- *************************************** SINGLE TABLE ACCESS PATH Single Table Cardinality Estimation for EMP[EMP] SPD: Return code in qosdDSDirSetup: NOCTX, estType = TABLE Table: EMP Alias: EMP Card: Original: 14.000000 Rounded: 14 Computed: 14.000000 Non Adjusted: 14.000000 Scan IO Cost (Disk) = 3.000000 Scan CPU Cost (Disk) = 39667.200000 Total Scan IO Cost = 3.000000 (scan (Disk)) = 3.000000 Total Scan CPU Cost = 39667.200000 (scan (Disk)) = 39667.200000 --//CPU Cost = 39667.200000,CPU Cost与我前面的计算一样。 Access Path: TableScan Cost: 3.002186 Resp: 3.002186 Degree: 0 Cost_io: 3.000000 Cost_cpu: 39667 Resp_io: 3.000000 Resp_cpu: 39667 Best:: AccessPath: TableScan Cost: 3.002186 Degree: 1 Resp: 3.002186 Card: 14.000000 Bytes: 0.000000 --//知道Cost_cpu=39667如何转化为COST成本呢?你可以理解Cost_cpu 就是执行指令的数量,这样除以CPUSPEEDNW=1512 * 10^6,就转 --//化为秒数。oracle基于成本的优化的COST单位相当于块,这样秒数再除以单块读时间SREADTIM就是对应的成本。 --//注意CPUSPEEDNW 的单位是 millions。而SREADTIM的单位是 毫秒。 --//这样计算公式如下: --// Cost = Cost_CPU_FROM_10053 /(CPUSPEEDNW * 10^6) / (SREADTIM/1000) = Cost_CPU_FROM_10053 /CPUSPEEDNW /SREADTIM/1000 --//SREADTIM的计算公式如下: --//SREADTIM = IOSEEKTIM + block_size / IOTFRSPEED = 10+8192/4096 =12 --//MREADTIM = IOSEEKTIM + mbrc * block_size / IOTFRSPEED = 10+8*8192/4096 =26 --//注:IOSEEKTIM 表示寻道时间,IOTFRSPEED 表示IO传输的速度,相当于每毫秒4K。 --//这样CPU COST的计算就是 --//39667.2/1512/12/1000 = .00218624338624338624 ,取小数点后6位就是0.002186,与前面计算一致。 --// 以前写的计算公式: SCOTT@book01p> @sys_stats.sql PNAME PVAL1 CALCULATED FORMULA ------------------------------ ---------- ---------- ------------------------------------------------------------ CPUSPEED CPUSPEEDNW 1512.17698 IOSEEKTIM 10 IOTFRSPEED 4096 MAXTHR MBRC 8 = _db_file_optimizer_read_count MREADTIM 26 = IOSEEKTIM + db_block_size * MBRC / IOTFRSPEED SLAVETHR SREADTIM 12 = IOSEEKTIM + db_block_size / IOTFRSPEED maximum mbrc 105.650794 = buffer cache size in blocks / sessions single block Cost per block 1 by definition multi block Cost per block .2708 = 1/MBRC * MREADTIM/SREADTIM 12 rows selected. 4.附上10053x.sql脚本: $ cat 10053x.sql set term off execute dbms_sqldiag.dump_trace(p_sql_id=>'&1',p_child_number=>&2,p_component=>'Compiler',p_file_id=>'a'||'&&1'); set term on set head off @ t set head on define 1=&trc
[20250813]CPU COST转化为COST成本计算.txt
来源:这里教程网
时间:2026-03-03 22:37:52
作者:
编辑推荐:
- [20250813]CPU COST转化为COST成本计算.txt03-03
- [20250815]关于CPU成本计算(补充)2.txt03-03
- 当varchar和Nvarchar关联03-03
- [20250815]关于CPU成本计算(补充)3.txt03-03
- 应用分发免费平台域名绑定要求03-03
- 记一次Oracle物化视图自动刷新异常案例分析03-03
- Oracle DDL不可以直接在数据字典上的场景03-03
- TFA引起的端口漏洞处理03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 当varchar和Nvarchar关联
当varchar和Nvarchar关联
26-03-03 - 记一次Oracle物化视图自动刷新异常案例分析
记一次Oracle物化视图自动刷新异常案例分析
26-03-03 - Oracle DDL不可以直接在数据字典上的场景
Oracle DDL不可以直接在数据字典上的场景
26-03-03 - TFA引起的端口漏洞处理
TFA引起的端口漏洞处理
26-03-03 - 故障是试金石:从一次Oracle宕机看成熟IT系统的韧性
故障是试金石:从一次Oracle宕机看成熟IT系统的韧性
26-03-03 - Oracle数据文件被误删除,无任何备份,如何导出剩余的数据?
Oracle数据文件被误删除,无任何备份,如何导出剩余的数据?
26-03-03 - Oracle11g监听程序不支持服务
Oracle11g监听程序不支持服务
26-03-03 - 存储裂缝之“救赎” ——Oracle 数据坏块故障修复纪实
存储裂缝之“救赎” ——Oracle 数据坏块故障修复纪实
26-03-03 - Oracle 23ai Datatype Limits有哪些?
Oracle 23ai Datatype Limits有哪些?
26-03-03 - In-memory不要全加载怎么做?
In-memory不要全加载怎么做?
26-03-03
