[20190823]关于CPU成本计算2.txt
[20190823]关于CPU成本计算2.txt
--//前几天探究CPU cost时遇到的问题,获取行成本时我的测试查询结果出现跳跃,不知道为什么,感觉有点奇怪,分析看看。
--//ITPUB原始链接已经不存在,我的日记本还有记录,现在想想当时的记录思路很乱,不过这些都是猜测的过程,以前思路混乱也是正常的。
--//顺便做一些必要补充。
1.环境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
2.测试:
SCOTT@test01p> create table t as select rownum a1 , rownum a2 ,rownum a3 from dual connect by level<=100 ;
Table created.
--//分析略.
select 'explain plan set statement_id='''||lpad(rownum,3,'0')||''''||' for select 1 from t where rownum<='||rownum||';' c80 from t;
--//把以上的输出保存一个文件执行,然后执行如下:
select STATEMENT_ID,CPU_COST,lead(cpu_cost ) over ( order by STATEMENT_ID ) N1,lead(cpu_cost ) over ( order by STATEMENT_ID )- cpu_cost N2 from (
select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL');
STATEMENT_ CPU_COST N1 N2
---------- -------- ----- ----
001 7271 7421 150
002 7421 7571 150
003 7571 7721 150
004 7721 7871 150
005 7871 8021 150
006 8021 8321 300
007 8321 8321 0
008 8321 8471 150
009 8471 8621 150
010 8621 8771 150
011 8771 8921 150
012 8921 9071 150
013 9071 9371 300
014 9371 9371 0
015 9371 9521 150
016 9521 9671 150
017 9671 9821 150
018 9821 9971 150
019 9971 10121 150
020 10121 10271 150
021 10271 10421 150
022 10421 10571 150
023 10571 10721 150
024 10721 10871 150
025 10871 18143 7272
026 18143 18293 150
027 18293 18593 300
028 18593 18593 0
029 18593 18743 150
030 18743 18893 150
031 18893 19043 150
032 19043 19193 150
033 19193 19343 150
034 19343 19493 150
035 19493 19643 150
036 19643 19793 150
037 19793 19943 150
038 19943 20093 150
039 20093 20243 150
040 20243 20393 150
041 20393 20543 150
042 20543 20693 150
043 20693 20843 150
044 20843 20993 150
045 20993 21143 150
046 21143 21293 150
047 21293 21443 150
048 21443 21593 150
049 21593 21743 150
050 21743 29014 7271
051 29014 29164 150
052 29164 29314 150
053 29314 29464 150
054 29464 29914 450
055 29914 29914 0
056 29914 29914 0
057 29914 30064 150
058 30064 30214 150
059 30214 30364 150
060 30364 30514 150
061 30514 30664 150
062 30664 30814 150
063 30814 30964 150
064 30964 31114 150
065 31114 31264 150
066 31264 31414 150
067 31414 31564 150
068 31564 31714 150
069 31714 31864 150
070 31864 32014 150
071 32014 32164 150
072 32164 32314 150
073 32314 32464 150
074 32464 32614 150
075 32614 39886 7272
076 39886 40036 150
077 40036 40186 150
078 40186 40336 150
079 40336 40486 150
080 40486 40636 150
081 40636 40786 150
082 40786 40936 150
083 40936 41086 150
084 41086 41236 150
085 41236 41386 150
086 41386 41536 150
087 41536 41686 150
088 41686 41836 150
089 41836 41986 150
090 41986 42136 150
091 42136 42286 150
092 42286 42436 150
093 42436 42586 150
094 42586 42736 150
095 42736 42886 150
096 42886 43036 150
097 43036 43186 150
098 43186 43486 300
099 43486 43486 0
100 43486
100 rows selected.
--//大于7271的部分,我前面已经解析.
--//在STATEMENT_ID=025,050,075,N2分别是7272,7271,7272.说明在statement_id=026,051,076多访问1块。
--//可以这么理解表T占4blocks,共100行,平均下来每块25行。这样当查询等于rownum<=26,51,76时出现多访问1块的情况。
--//剩下就是为什么查询条件rownum<=55,rownum<=56,rownum<=57时CPU_COST一样的,不好理解。N2出现跳跃的情况呢?
3.继续探究:
SCOTT@test01p> set feedback only
SCOTT@test01p> select 1 from t where rownum<=55 ;
1
----------
55 rows selected.
SCOTT@test01p> set feedback 6
SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID g2r21fyyf3y90, child number 1
-------------------------------------
select 1 from t where rownum<=55
Plan hash value: 508354683
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 3 (100)| | 55 |00:00:00.01 | 6 |
|* 1 | COUNT STOPKEY | | 1 | | | | 55 |00:00:00.01 | 6 |
| 2 | TABLE ACCESS FULL| T | 1 | 57 | 3 (0)| 00:00:01 | 55 |00:00:00.01 | 6 |
-------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=55)
--//注意看E-Rows = 57.噢!这样明白为什么出现跳跃.是oracle估计选择率的算法非常特别造成这样的情况.
--//感觉oracle这样条件算法有点奇怪,什么可能查询条件rownum<=55,E-Rows = 57呢?
--//看看select 1 from t where rownum<=7的执行计划也可以验证:
SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID a8yj08mysamg1, child number 0
-------------------------------------
select 1 from t where rownum<=7
Plan hash value: 508354683
-------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
-------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 2 (100)| | 7 |00:00:00.01 | 6 |
|* 1 | COUNT STOPKEY | | 1 | | | | 7 |00:00:00.01 | 6 |
| 2 | TABLE ACCESS FULL| T | 1 | 8 | 2 (0)| 00:00:01 | 7 |00:00:00.01 | 6 |
-------------------------------------------------------------------------------------------------------------
--//E-ROWS=8.这样就明白为什么我当时的算法每行成本出现跳跃的情况.其它大家可以自行验证.
4.选择率如何计算呢?
--//rownun<=N,这样的查询我看了<基于成本的Oracle优化法则>,也没有这方面的内容.
--//我试图按照区间的算法不对.
--// Selectivity = (limit – low_value) / (high_value – low_value) + 1/num_distinct
--//(55-1)/(100-1)+1/100 = .55545454545454545454 , 不对,rownum虚拟列,这样的查询条件选择率如何确定不知道.
SCOTT@test01p> set feedback only
SCOTT@test01p> select 1 from t where a1<=55 ;
1
----------
55 rows selected.
SCOTT@test01p> set feedback 6
SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 4vmjyzbu16y74, child number 0
-------------------------------------
select 1 from t where a1<=55
Plan hash value: 1601196873
--------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 55 |00:00:00.01 | 10 |
|* 1 | TABLE ACCESS FULL| T | 1 | 56 | 168 | 3 (0)| 00:00:01 | 55 |00:00:00.01 | 10 |
--------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("A1"<=55)
--//如果查询select 1 from t where a1<=55;E-Rows=56,按照上面公式Selectivity = (limit – low_value) / (high_value – low_value) + 1/num_distinct
--//计算的结果是正确的.
--//仅仅知道为什么出现上面的情况,不知道条件rownum<=N的选择率计算公式.
--//如果加大NUMROWS=> 1000,就不会出现前面的情况.
SCOTT@test01p> exec dbms_stats.set_table_stats(ownname=> NULL,TABNAME=>'T',NUMROWS=> 1000);
PL/SQL procedure successfully completed.
SCOTT@test01p> alter system flush shared_pool;
System altered.
--//select 'explain plan set statement_id='''||lpad(rownum,3,'0')||''''||' for select 1 from t where rownum<='||rownum||';' c80 from t;
SCOTT@test01p> SELECT *
FROM (SELECT STATEMENT_ID,CPU_COST,lead(cpu_cost )
OVER ( ORDER BY STATEMENT_ID ) N1,lead(cpu_cost )
OVER ( ORDER BY STATEMENT_ID )- cpu_cost N2
FROM ( SELECT STATEMENT_ID,
OPERATION, OPTIONS, COST, CPU_COST, IO_COST,
TIME FROM plan_table WHERE options = 'FULL') )
WHERE N2 <> 150;
no rows selected
[20190823]关于CPU成本计算2.txt的更多相关文章
- [20190823]关于CPU成本计算3.txt
[20190823]关于CPU成本计算3.txt --//前几天探究CPU cost时遇到的问题,获取行成本时我的测试查询结果出现跳跃,不知道为什么,感觉有点奇怪,分析看看.--//ITPUB原始链接 ...
- [20190821]关于CPU成本计算.txt
[20190821]关于CPU成本计算.txt --//有人问链接http://blog.itpub.net/267265/viewspace-2653964/中CPU成本如何计算的,实际上一般在优化 ...
- Trusted Execution Technology (TXT) --- 基本原理篇
版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.cnblogs.com/tsec/p/8409600.html 1. Intel TXT 介绍 TXT是Trusted Ex ...
- shell脚本监控系统负载、CPU和内存使用情况
hostname >>/home/vmuser/xunjian/xj.logdf -lh >>/home/vmuser/xunjian/xj.logtop -b -n 1 | ...
- Linux CPU Hotplug CPU热插拔
http://blog.chinaunix.net/uid-15007890-id-106930.html CPU hotplug Support in Linux(tm) Kernel Linu ...
- centos 查看脚本
centos 查看脚本 #!/bin/bash date >>info.txt echo "本机centos版本为" >>info.txt cat /etc ...
- Oracle的优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- Oracle优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- Linux 性能搜集【linux_reports-cpu/memory/disks/network】
为方便问题发生后,问题原因的分析排查,我们可以在服务器中事先部署如下脚本,方便故障发生后,问题原因的分析排查 脚本部署方法: 1.将脚本[linux_reports.sh]上传到服务器 2.登陆虚拟机 ...
随机推荐
- 剑指offer笔记面试题13----机器人的运动范围
题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它每次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子.例如,当k为18时,机器人能够进入方格( ...
- Vue组件化开发
Vue的组件化 组件化是Vue的精髓,Vue就是由一个一个的组件构成的.Vue的组件化设计到的内容又非常多,当在面试时,被问到:谈一下你对Vue组件化的理解.这时候又有可能无从下手,因此在这里阐释一下 ...
- ArcGIS Desktop中为图像设置成不显示背景色
加载的栅格图层在arcgis中显示有黑色背景 方法一:如果有矢量边界的话,直接用矢量边界把黑色背景裁剪掉即可. 方法二: 如果是RGB三色: 这个只是不显示,并不改变原有的值 如果是值: 附:为影像数 ...
- sqlserver实现分隔字符串
sqlserver 使用函数实现分隔字符串 create function dbo.fn_split ( @str_source nvarchar(max), ) ) returns @temp ta ...
- 缺少控制文件备份时如何还原数据库 (Doc ID 1438776.1)
How to restore database when controlfile backup missing (Doc ID 1438776.1) APPLIES TO: Oracle Databa ...
- GPU 编程相关 简要摘录
GPU 编程可以称为异构编程,最近由于机器学习的火热,很多模型越来越依赖于GPU来进行加速运算,所以异构计算的位置越来越重要:异构编程,主要是指CPU+GPU或者CPU+其他设备(FPGA等)协同计算 ...
- s3c2440裸机-UART编程(二、UART编程实现)
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解. 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putc ...
- 克服悲伤情绪的三个P原则
1.自责(Personalization) --不要自责 2.永久化(Permanence) --悲伤不会永远存在,一切都会过去 据科学研究发现:人遇到开心或悲伤的事情之后,心情在短期内会产生巨大的波 ...
- Java之匿名对象
匿名对象概念 创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量.虽然是创建对象的简化写法,但是应用场景非常有限.匿名对象 :没有变量名的对象. 格式: new 类名(参数列表): // ...
- Codeforces Round #603 (Div. 2) D. Secret Passwords 并查集
D. Secret Passwords One unknown hacker wants to get the admin's password of AtForces testing system, ...