[20250815]关于CPU成本计算(补充)2.txt --//以前测试过,当时一边做一边猜测,反推X,Y,Z的值,有点乱,做一些必要的整理,补充索引的一些测试。 --//看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。 --//补充谓词部分字段参与运算成本的情况,每增加1个字段增加50,或者增加一个运算增加50. --//以前测试在谓词使用函数存在问题,各种函数的成本并不是固定,另外写一篇blog说明。 --//扫描唯一索引块成本 1050。 --//里面的X,Y,Z值很容易确定,后面的测试有一些混乱,重新做1次,以前的测试参考:[20190821]关于CPU成本计算.txt 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.测试1: SCOTT@book01p> create table t as select rownum a1 , rownum a2 ,rownum a3 from dual connect by level<=100 ; Table created. --//分析表略。 SCOTT@book01p> select blocks,num_rows from user_tables where table_name='T'; BLOCKS NUM_ROWS ---------- ---------- 4 100 column STATEMENT_ID format a10 column OPTIONS format a10 column time format 9999 explain plan set statement_id='a1' for select 1 from t where a1=1; explain plan set statement_id='a2' for select 1 from t where a2=1; explain plan set statement_id='a3' for select 1 from t where a3=1; explain plan set statement_id='a1x' for select 1 from t where a1=:N1; explain plan set statement_id='a2x' for select 1 from t where a2=:N1; explain plan set statement_id='a3x' for select 1 from t where a3=:N1; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ---------- ---------- ---------- ---------- ----- a1 TABLE ACCESS FULL 3 48486 3 1 a2 TABLE ACCESS FULL 3 50486 3 1 a3 TABLE ACCESS FULL 3 52486 3 1 a1x TABLE ACCESS FULL 3 58486 3 1 a2x TABLE ACCESS FULL 3 60486 3 1 a3x TABLE ACCESS FULL 3 62486 3 1 6 rows selected. --//select部分cost,没有查询字段。 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - Lowest_column_id) = 7121.44 * 4 + 150*100 + 20*150*(1-1) = 43485.76 = 43486 --//可以发现where中cost对比如下: --//使用非绑定变量的情况: a1=1 48486-43486 = 5000 a2=1 50486-43486 = 7000 a3=1 52486-43486 = 9000 --//使用绑定变量的情况: a1=:N1 58486-43486 = 15000 a2=:N1 60486-43486 = 17000 a3=:N1 62486-43486 = 19000 --//使用非绑定变量的情况: --//对应a1=100条件,表T共用100条记录,对比100次,这样每次比较5000/100 = 50. --//以此类推a2=100,每次7000/100 = 70.a3=100,每次9000/100 = 90. --//结合前面的Z=20(20 CPU Cycles for Column Skip).where的cost实际上的计算公式如下: rows*50+rows*((Highest_column_id-1)*20). --//实际上可以理解每次比较的cpu cost是50. 也就是可以 A=50. --//使用绑定变量的情况: --//与前面类似,很容易推导使用绑定变量每次比较的CPU COST = 150. --//注真实的情况也许很复杂,也许谓词存在and 或者 or ,这样我估计oracle优先选择在选择性很好的字段做比较。 --//参考:[20190821]关于CPU成本计算.txt,里面有一些更复杂的测试。 3.测试2: --//测试谓词使用函数的情况,推断使用函数的cpu cost。 --//测试前退出在登录,因为查询plan_table是临时表。 column STATEMENT_ID format a10 column OPTIONS format a10 column time format 9999 explain plan set statement_id='a1' for select 1 from t where to_char(a1)='1'; explain plan set statement_id='a2' for select 1 from t where to_char(a2)='1'; explain plan set statement_id='a3' for select 1 from t where to_char(a3)='1'; explain plan set statement_id='a1x' for select 1 from t where to_char(a1)=:N1; explain plan set statement_id='a2x' for select 1 from t where to_char(a2)=:N1; explain plan set statement_id='a3x' for select 1 from t where to_char(a3)=:N1; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ---------- ---------- ---------- ---------- ----- a1 TABLE ACCESS FULL 3 58486 3 1 a2 TABLE ACCESS FULL 3 60486 3 1 a3 TABLE ACCESS FULL 3 62486 3 1 a1x TABLE ACCESS FULL 3 58486 3 1 a2x TABLE ACCESS FULL 3 60486 3 1 a3x TABLE ACCESS FULL 3 62486 3 1 6 rows selected. --//select部分cost,没有查询字段。 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - Lowest_column_id) = 7121.44 * 4 + 150*100 + 20*150*(1-1) = 43485.76 = 43486 --//可以发现where中cost对比如下: --//使用非绑定变量的情况: to_char(a1)='1' 58486-43486 = 15000 to_char(a2)='1' 60486-43486 = 17000 to_char(a3)='1' 62486-43486 = 19000 --//使用绑定变量的情况: to_char(a1)=:N1; 58486-43486 = 15000 to_char(a2)=:N1; 60486-43486 = 17000 to_char(a3)=:N1; 62486-43486 = 19000 --//可以发现where中cost对比如下: to_char(a1)='1' 58486-43486 = 15000 to_char(a2)='1' 60486-43486 = 17000 to_char(a3)='1' 62486-43486 = 19000 --//对应a1=100条件,表T共用100条记录,对比100次,这样每次 15000/100 = 150. --//以此类推a2=100,每次17000/100 = 170.a3=100,每次19000/100 = 190. --//根据前面的测试,排除字段的成本(20),比较每次50,可以推断函数部分占100,感觉这部分也太少了!! --//字段= 常量的比较每次50,而引入函数仅仅增加100。我个人感觉oracle设置太小了,应该设置500. --//注:我一直以为所有的函数的成本都是一样的,实际的情况各个函数不同,另外写一篇blog说明,我这里的测试使用to_char实际上 --//是使用函数里面最小的情况。 --//换一个测试方法: SCOTT@book01p> explain plan set statement_id='xxx' for select to_char(a1) from t where rownum=1; Explained. SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where statement_id='xxx'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ---------- ---------- ---------- ---------- ----- xxx SELECT STATEMENT 2 7271 2 1 xxx COUNT STOPKEY xxx TABLE ACCESS FULL 2 7271 2 1 --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - 1) = 7121.44 * 1 + 150*1 = 7271.44 --//在select出现的函数不计算cost。 4.测试3: --//测试谓词部分字段运算成本,这部分以前没有测试过。 column STATEMENT_ID format a16 column OPTIONS format a10 column time format 9999 explain plan set statement_id='A1+1' for select 1 from t where a1+1=100; explain plan set statement_id='A1+A1' for select 1 from t where a1+a1=100; explain plan set statement_id='A1+A2' for select 1 from t where a1+a2=100; explain plan set statement_id='A1+A2*2' for select 1 from t where a1+a2*2=100; explain plan set statement_id='A1+A2+A3' for select 1 from t where A1+A2+A3=100; explain plan set statement_id='power(A1)+A2' for select 1 from t where power(A1,2)+A2=100; explain plan set statement_id='XA1+1' for select 1 from t where a1+1=:N1; explain plan set statement_id='XA1+A1' for select 1 from t where a1+a1=:N1; explain plan set statement_id='XA1+A2' for select 1 from t where a1+a2=:N1; explain plan set statement_id='XA1+A2*2' for select 1 from t where a1+a2*2=:N1; explain plan set statement_id='XA1+A2+A3' for select 1 from t where A1+A2+A3=:N1; explain plan set statement_id='Xpower(A1)+A2' for select 1 from t where power(A1,2)+A2=:N1; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL'; STATEMENT_ID OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------------- ------------------------------ ---------- ---------- ---------- ---------- ----- A1+1 TABLE ACCESS FULL 3 53486 3 1 A1+A1 TABLE ACCESS FULL 3 53486 3 1 A1+A2 TABLE ACCESS FULL 3 55486 3 1 A1+A2*2 TABLE ACCESS FULL 3 60486 3 1 A1+A2+A3 TABLE ACCESS FULL 3 62486 3 1 power(A1)+A2 TABLE ACCESS FULL 3 80486 3 1 XA1+1 TABLE ACCESS FULL 3 63486 3 1 XA1+A1 TABLE ACCESS FULL 3 63486 3 1 XA1+A2 TABLE ACCESS FULL 3 65486 3 1 XA1+A2*2 TABLE ACCESS FULL 3 70486 3 1 XA1+A2+A3 TABLE ACCESS FULL 3 72486 3 1 Xpower(A1)+A2 TABLE ACCESS FULL 3 90486 3 1 12 rows selected. --//select部分cost,没有查询字段。 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - Lowest_column_id) = 7121.44 * 4 + 150*100 + 20*150*(1-1) = 43485.76 = 43486 --//可以发现where中cost对比如下: --//使用非绑定变量的情况: A1+1 53486 - 43486 = 10000 A1+A1 53486 - 43486 = 10000 A1+A2 55486 - 43486 = 12000 A1+A2*2 60486 - 43486 = 17000 A1+A2+A3 62486 - 43486 = 19000 power(A1)+A2 80486 - 43486 = 37000 --//带运算比较的起点是100,有字段参与运算,oracle并不像函数那样A=150. 而是根据运算的不同发生一些变化。 --//注意排序字段成本每个20. A1+1 100 A1+A1 100 A1+A2 100 A1+A2*2 150 A1+A2+A3 150 power(A1)+A2 350 --//使用绑定变量的情况: XA1+1 63486 - 43486 = 20000 XA1+A1 63486 - 43486 = 20000 XA1+A2 65486 - 43486 = 22000 XA1+A2*2 70486 - 43486 = 27000 XA1+A2+A3 72486 - 43486 = 29000 Xpower(A1)+A2 90486 - 43486 = 47000 --//对比前面非绑定变量的情况,每个总的增加10000,也就是每次比较比非绑定变量增加100. --//注意排序字段成本每个20. XA1+1 200 XA1+A1 200 XA1+A2 200 XA1+A2*2 250 XA1+A2+A3 250 Xpower(A1)+A2 450 --//还是简单看出一些规律,比如增加1个简单运算增50,是否各个函数有关cost,oracle内部存在定义,power(A1,2)定义300. --//也许前面测试使用to_char函数定义很低。 --//采用绑定变量增100. --//补充测试: column STATEMENT_ID format a10 column OPTIONS format a10 column time format 9999 explain plan set statement_id='p1' for select 1 from t where power(A1,2)=100; explain plan set statement_id='p2' for select 1 from t where power(A1,2)=:N1; explain plan set statement_id='s1' for select 1 from t where sqrt(A1)=100; explain plan set statement_id='s2' for select 1 from t where sqrt(A1)=:N1; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL'; STATEMENT_ID OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------------- ------------------------------ ---------- ---------- ---------- ---------- ----- p1 TABLE ACCESS FULL 3 73486 3 1 p2 TABLE ACCESS FULL 3 83486 3 1 s1 TABLE ACCESS FULL 3 68486 3 1 s2 TABLE ACCESS FULL 3 78486 3 1 power(A1,2)=100; 73486-43486 = 30000 power(A1,2)=:N1; 83486-43486 = 40000 sqrt(A1)=100; 68486-43486 = 25000 sqrt(A1)=:N1; 78486-43486 = 35000 --//看来oracle每个函数的定义都不相同。 explain plan set statement_id='q1' for select power(a1,2) from t where rownum=1; explain plan set statement_id='q2' for select sqrt(a1) from t where rownum=1; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where options='FULL' and STATEMENT_ID like 'q%'; STATEMENT_ID OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------------- ------------------------------ ---------- ---------- ---------- ---------- ----- q1 TABLE ACCESS FULL 2 7271 2 1 q2 TABLE ACCESS FULL 2 7271 2 1 --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - 1) = 7121.44 * 1 + 150*1 = 7271.44 --//在select出现的函数不计算cost。 5.测试4: --//建立索引看看。 SCOTT@book01p> create unique index i_t_a3 on t(a3); Index created. SCOTT@book01p> create index i_t_a2 on t(a2); Index created. column STATEMENT_ID format a10 column OPTIONS format a12 column time format 9999 explain plan set statement_id='b2' for select 1 from t where a2 = 50; explain plan set statement_id='b3' for select 1 from t where a3 = 50; explain plan set statement_id='b2x' for select 1 from t where a2 = :N1; explain plan set statement_id='b3x' for select 1 from t where a3 = :N1; SCOTT@book01p> column OPTIONS format a12 SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where OPERATION='INDEX'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ------------ ---------- ---------- ---------- ----- b2 INDEX RANGE SCAN 1 7321 1 1 b3 INDEX UNIQUE SCAN 0 1050 0 1 b2x INDEX RANGE SCAN 1 7321 1 1 b3x INDEX UNIQUE SCAN 0 1050 0 1 --//RANGE SCAN , UNIQUE SCAN 不同,前者7321. 后者1050. explain plan set statement_id='b2' for select 1 from t where a2 = 50; --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - 1) 7121.44 * 0 + 150*0 = 0 --//索引部分,实际上与数据块类似,可以想象索引就是仅仅包含索引字段的表,如果不是唯一索引与数据块类似。 7121.44 * blocks + 150*rows + 50*compare_counts 7121.44 * 1 + 150*1 = 7271.44 --//比较部分成本1次:50 7271.44+50 = 7321.44 explain plan set statement_id='b3' for select 1 from t where a3 = 50; --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - 1) 7121.44 * 0 + 150*0 = 0 --//比较部分成本1次:50 --//这样扫描索引块的成本就是1000. --//继续探究索引的如何计算: column STATEMENT_ID format a10 column OPTIONS format a12 column time format 9999 explain plan set statement_id='c1' for select 1 from t where a3 between 1 and 1; explain plan set statement_id='c2' for select 1 from t where a3 between 1 and 2; explain plan set statement_id='c3' for select 1 from t where a3 between 1 and 3; explain plan set statement_id='c4' for select 1 from t where a3 between 1 and 4; explain plan set statement_id='c5' for select 1 from t where a3 between 1 and 5; explain plan set statement_id='c6' for select 1 from t where a3 between 1 and 6; explain plan set statement_id='c7' for select 1 from t where a3 between 1 and 7; explain plan set statement_id='c8' for select 1 from t where a3 between 1 and 8; explain plan set statement_id='c9' for select 1 from t where a3 between 1 and 9; SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID like 'c%' and OPERATION='INDEX'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ------------ ---------- ---------- ---------- ----- c1 INDEX UNIQUE SCAN 0 1050 0 1 c2 INDEX RANGE SCAN 1 7721 1 1 c3 INDEX RANGE SCAN 1 7921 1 1 c4 INDEX RANGE SCAN 1 8121 1 1 c5 INDEX RANGE SCAN 1 8321 1 1 c6 INDEX RANGE SCAN 1 8521 1 1 c7 INDEX RANGE SCAN 1 8721 1 1 c8 INDEX RANGE SCAN 1 8921 1 1 c9 INDEX RANGE SCAN 1 9121 1 1 9 rows selected. --//a3 between 1 and 1智能判断使用UNIQUE SCAN,而RANGE SCAN,每次增加1,查询的cost增加200. --//explain plan set statement_id='c2' for select 1 from t where a3 between 1 and 2; --//7721-7121 = 600 ,增加600. --//你可以想象索引就是仅仅包含索引字段的表,a3 between 1 and 2相当于比较3次。 --//按照情况,扫描索引数据块1,3行,比较3次来计算。 7121.44 * blocks + 150*rows + 50*compare_counts 7121.44 * 1 + 150*3 + 20*rows* ( 1 - 1) + 50*3 = 7721.44 --//仅仅对于唯一索引扫描不同其CPU COST成本 1000+50。 6.补充一些例子说明问题: SCOTT@book01p> column OPTIONS format a30 SCOTT@book01p> explain plan set statement_id='e3' for select a3 from t where a2 = 50; Explained. SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID like 'e3'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ------------------------------ ---------- ---------- ---------- ----- e3 SELECT STATEMENT 2 14633 2 1 e3 TABLE ACCESS BY INDEX ROWID BATCHED 2 14633 2 1 e3 INDEX RANGE SCAN 1 7321 1 1 --//索引部分: 7121.44 * blocks + 150*rows + 50*compare_counts 7121.44 * 1 + 150*1 + 50*1 = 7321.44 --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - Lowest_column_id) ==7121.44 * 1 + 150*1 + 20*1* (3-1) =7311.44 --//7321.44+7311.44 = 14632.88 --//取整正好是14633 --//删除索引。 SCOTT@book01p> drop index i_t_a3; Index dropped. SCOTT@book01p> drop index i_t_a2; Index dropped. SCOTT@book01p> explain plan set statement_id='e4' for select a2 from t where a3 = 50; Explained. SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID like 'e4'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ------------------------------ ------------------------------ ---------- ---------- ---------- ----- e4 SELECT STATEMENT 3 52486 3 1 e4 TABLE ACCESS FULL 3 52486 3 1 --//谓词比较部分: --//比较100次,这样比较cost 50*100 = 5000 --//select部分: 7121.44 * blocks + 150*rows + 20*rows* ( Highest_column_id - Lowest_column_id) =7121.44 * 4 + 150*100 + 20*100* (3-1) =47485.76 --//47485.76+5000 = 52485.76 --//注意Highest_column_id =3,因为where a3 = 50。 --//重复以前的1个例子: SCOTT@book01p> explain plan set statement_id='bb' for select a3 from t where a2=100 ; Explained. SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID='bb'; STATEMENT_ OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------- ---------------- ------- ---- -------- ------- ---- bb SELECT STATEMENT 3 50506 3 1 bb TABLE ACCESS FULL 3 50506 3 1 --//我先说说我的理解然后计算: --//如果查询时第1条记录是a2=1,这样根本不用取a3字段直接跳过这条记录,这样select部分仅仅取a2后然后比较 --//如果a2=100符合查询条件再取字段a3.有了这样理解cpu cost计算就简单了. --//select部分,开始仅仅需要取到a2字段(即使select部分包含a3): 7121.44 * blocks + 150*rows + 20*rows* (Highest_column_id - Lowest_column_id) 7121.44 * 4 + 150*100 + 20*rows* ( 2 - 1) = 43485.76 + 2000 = 45486 --//where部分: 比较100次 100*50=5000 仅仅1条符合a2=100.取a3字段成本 : 20*rows* (Highest_column_id - Lowest_column_id) 20*1*(3-2) = 20 --//cpu cost 45486 + 5000+ 20 = 50506 --//完全符合. --//补充说明:字段成本分2次计算 --//第一次是 20*rows* ( Highest_column - Lowest_column) ,这里的Highest_column=2,Lowest_column=1.rows=100. --//第二次是 20*rows* ( Highest_column - Lowest_column) ,这里的Highest_column=3,Lowest_column=2.rows=1. --//总之字段成本要看select以及查询条件结合起来判断,出现的情况可能比较复杂. 6.再补充索引的情况: --//删除前面建立的索引。 SCOTT@book01p> create index i_t_a3_a2 on t(a3,a2); Index created. SCOTT@book01p> explain plan set statement_id='f1' for select a1 from t where a3 = 50; Explained. SCOTT@book01p> select STATEMENT_ID,OPERATION, OPTIONS, COST, CPU_COST, IO_COST, TIME from plan_table where STATEMENT_ID like 'f1%'; STATEMENT_ID OPERATION OPTIONS COST CPU_COST IO_COST TIME ---------------- ------------------------------ ----------------------- ---------- ---------- ---------- ----- f1 SELECT STATEMENT 2 14633 2 1 f1 TABLE ACCESS BY INDEX ROWID BATCHED 2 14633 2 1 f1 INDEX RANGE SCAN 1 7321 1 1 --//分开2部分计算: --//索引部分: 7121.44 * blocks + 150*rows + 20*rows* (Highest_column_id - Lowest_column_id) 7121.44+150+0 = 7271.44 --//比较1次 50 7271.44+50 = 7321.44 --//注意在索引a3是第1个字段。 --//select部分: 7121.44 * blocks + 150*rows + 20*rows* (Highest_column_id - Lowest_column_id) 7121.44+150+0 = 7271.44 7271.44+7321.44 = 14592.88 --//可以发现我的计算对不上,相差14633-14593 = 40。似乎取到A3字段。 7.总结: --//首先以上大部分内容完全是先有cpu cost,再反推数值,也许内部的计算更复杂。 --//大概还是存在一些规律: --//每块的CPU COST X=7121.44。 --//每行的CPU COST Y=150 --//每列的CPU COST Z=20,注意计算Highest_column_id --//谓词部分使用常量比较成本 A=50 ,引入函数比较成本每个函数的成本不同!! --//谓词部分使用绑定变量比较成本再增加 100。 --//补充谓词部分字段运算成本,每增加1个字段增加50,增加运算50. --//扫描唯一索引块成本 1050。 --//在select出现的函数不计算cost。 --//CPU COST计算分成几个部分: --//扫描块数量的成本 --//扫描行数量的成本 --//扫描字段的成本,取决于字段在段的位置。 --//建议反复看看explain plan set statement_id='bb' for select a3 from t where a2=100 ;的例子 --//可以理解分2部分。 --//谓词比较成本,50起步,增加1个运算增50,增加1个字段增50。注:仅仅是我上面观察到的结果。 --//谓词部分使用绑定变量比较成本再增加 100。 --//索引部分的情况类似,你可以把索引想象为包含索引字段的表,与数据块部分分开计算。 --//特殊的情况是唯一索引扫描,块的成本是1050.
[20250815]关于CPU成本计算(补充)2.txt
来源:这里教程网
时间:2026-03-03 22:37:51
作者:
编辑推荐:
- [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
- [20250804]简单探究oracle long数据类型.txt03-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
