計算表掃描中執行計劃的COST
以下計算執行計劃中表掃描的成本實驗是在AIX平臺下10.2.0.1進行的:
1、建立測試表
SQL>execute dbms_random.seed(0);
SQL>create table t1
pctfree 99
pctused 1
as
with generator as (
select --+ materialize
rownum id
from all_objects
where rownum <=3000
)
select /*+ ordered use_nl(v2) */
rownum id,
trunc(100*dbms_random.normal) val,
rpad('x', 100) padding
from
generator v1,
generator v2
where rownum <=10000;
2、進行統計分析
SQL>begin
dbms_stats.gather_table_stats(
user,
't1',
cascade =>true,
estimate_percent => null,
method_opt => 'for all columns size 1'
);
end;
/
3、檢視實際的IO和CPU成本
SQL>alter system flush shared_pool;
SQL>alter session set events '10053 trace name context forever, level 2';
SQL>select max(val) from t1;
SQL>alter session set events '10053 trace name context off';
提取跟蹤檔案相應數值:
跟蹤檔案:
cost_io=2221
cost_cpu=73954130
#Blks = 10146
cost=2228.75
4、10g下noworkload統計資訊以及相關引數查詢
SQL>select pname, pval1 from sys.aux_stats$
where sname='SYSSTATS_MAIN';
PNAME PVAL1
------------------------------ ----------
CPUSPEEDNW 795.134
IOSEEKTIM 10
IOTFRSPEED 4096
SQL>show parameter DB_FILE_MULTIBLOCK_READ_COUNT;
DB_FILE_MULTIBLOCK_READ_COUNT=16
該數值匹配到計算公式中mbrc
5、ORACLE10g的成本計算公式
cost = (#SRDs * SREADTIM +
#MRDs * MREADTIM +
#CPUCycles/cpuspeed)/SREADTIM
= #SRDs + --因為是表掃描,所以該值為0
#MRDs * MREADTIM/SREADTIM + -- IO cost
#CPUCycles/(cpuspeed * SREADTIM) -- CPU cost
6、手工計算IO成本,看是否與步驟2中IO成本實際值匹配
手工計算:
cost_io= #MRDs * MREADTIM/SREADTIM,所得數值取最大整數,另外隱含引數_table_scan_cost_plus_one=true,所以cost_io需要新增1。所以10g實際公式為:
cost_io=ceiling(#MRDs * MREADTIM/SREADTIM) +1
其中:
#MRDs=#Blks/mbrc=10146/16
MREADTIM=IOSEEKTIM + mbrc*db_block_size/IOTFRSPEED
= 10+ 16*8k/4k=42
SREADTIM=IOSEEKTIM + db_block_size/IOTFRSPEED
=10+8k/4k=12
cost_io=ceiling(10146/16*42/12)+1=ceiling(2219.4375)+1=2220+1=2221
計算值與步驟2中實際IO成本cost_io=2221一致。
7、手工計算CPU成本
cpu成本=#CPUCycles/(cpuspeed * SREADTIM)
其中
#CPUCycles等於10053跟蹤檔案中cost_cpu=73954130,
cpuspeed=795.134MHz=795134Hz
SREADTIM=12
所以
cpu成本=73954130/(795134*12)=7.75
8、總的成本計算值
cost=cost_io+ cpu成本=2221+7.75=2228.75
以上的計算值與實際所獲得的成本值完全一致。
備註:來源於Jonathan Lewis的《CBO基礎》第二章節tablescan。
1、建立測試表
SQL>execute dbms_random.seed(0);
SQL>create table t1
pctfree 99
pctused 1
as
with generator as (
select --+ materialize
rownum id
from all_objects
where rownum <=3000
)
select /*+ ordered use_nl(v2) */
rownum id,
trunc(100*dbms_random.normal) val,
rpad('x', 100) padding
from
generator v1,
generator v2
where rownum <=10000;
2、進行統計分析
SQL>begin
dbms_stats.gather_table_stats(
user,
't1',
cascade =>true,
estimate_percent => null,
method_opt => 'for all columns size 1'
);
end;
/
3、檢視實際的IO和CPU成本
SQL>alter system flush shared_pool;
SQL>alter session set events '10053 trace name context forever, level 2';
SQL>select max(val) from t1;
SQL>alter session set events '10053 trace name context off';
提取跟蹤檔案相應數值:
跟蹤檔案:
cost_io=2221
cost_cpu=73954130
#Blks = 10146
cost=2228.75
4、10g下noworkload統計資訊以及相關引數查詢
SQL>select pname, pval1 from sys.aux_stats$
where sname='SYSSTATS_MAIN';
PNAME PVAL1
------------------------------ ----------
CPUSPEEDNW 795.134
IOSEEKTIM 10
IOTFRSPEED 4096
SQL>show parameter DB_FILE_MULTIBLOCK_READ_COUNT;
DB_FILE_MULTIBLOCK_READ_COUNT=16
該數值匹配到計算公式中mbrc
5、ORACLE10g的成本計算公式
cost = (#SRDs * SREADTIM +
#MRDs * MREADTIM +
#CPUCycles/cpuspeed)/SREADTIM
= #SRDs + --因為是表掃描,所以該值為0
#MRDs * MREADTIM/SREADTIM + -- IO cost
#CPUCycles/(cpuspeed * SREADTIM) -- CPU cost
6、手工計算IO成本,看是否與步驟2中IO成本實際值匹配
手工計算:
cost_io= #MRDs * MREADTIM/SREADTIM,所得數值取最大整數,另外隱含引數_table_scan_cost_plus_one=true,所以cost_io需要新增1。所以10g實際公式為:
cost_io=ceiling(#MRDs * MREADTIM/SREADTIM) +1
其中:
#MRDs=#Blks/mbrc=10146/16
MREADTIM=IOSEEKTIM + mbrc*db_block_size/IOTFRSPEED
= 10+ 16*8k/4k=42
SREADTIM=IOSEEKTIM + db_block_size/IOTFRSPEED
=10+8k/4k=12
cost_io=ceiling(10146/16*42/12)+1=ceiling(2219.4375)+1=2220+1=2221
計算值與步驟2中實際IO成本cost_io=2221一致。
7、手工計算CPU成本
cpu成本=#CPUCycles/(cpuspeed * SREADTIM)
其中
#CPUCycles等於10053跟蹤檔案中cost_cpu=73954130,
cpuspeed=795.134MHz=795134Hz
SREADTIM=12
所以
cpu成本=73954130/(795134*12)=7.75
8、總的成本計算值
cost=cost_io+ cpu成本=2221+7.75=2228.75
以上的計算值與實際所獲得的成本值完全一致。
備註:來源於Jonathan Lewis的《CBO基礎》第二章節tablescan。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/354732/viewspace-613476/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- noworkload下全表掃描cost的計算
- oracle實驗記錄 (全表掃描COST計算方法)Oracle
- 執行計劃中cost, card的含義
- 執行計劃-資料訪問方式(全表掃描與4種索引的方式)索引
- 全表掃描的cost 與 索引掃描Cost的比較 – 無直方圖(10.1.0.3以後)索引直方圖
- Oracle的執行計劃及資料存取方式 (ROWID,掃描方式等)Oracle
- explain執行計劃中的key_len的計算規則AI
- oracle實驗記錄(分割槽全表掃描(全區掃描) FTS 時候的成本計算)Oracle
- 累計的力量,delete全表掃描導致程式執行時間過長。delete
- MySQL中的全表掃描和索引樹掃描MySql索引
- oracle實驗記錄 (分割槽表,掃描基數的計算)Oracle
- Oracle訪問表的執行計劃Oracle
- DB優化小常識 - 執行計劃中Cardinality的計算優化
- 看懂Oracle中的執行計劃Oracle
- oracle查詢語句執行計劃中的表消除Oracle
- oracle分割槽表執行計劃Oracle
- 10月份計劃表(每日執行)
- 引數Optimizer_index_cost_adj 對執行計劃的影響Index
- 執行計劃-1:獲取執行計劃
- oracle中執行計劃中的cardinalityOracle
- sql執行計劃變更和刪除快取中執行計劃的方法SQL快取
- oracle cost計算方式Oracle
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- 分割槽表與堆表執行計劃的不同
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- SQLSERVER中得到執行計劃的方式SQLServer
- MySQL中in(常量列表)的執行計劃MySql
- TOAD檢視執行計劃表
- 執行計劃
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- 分析執行計劃最佳化SQLORACLE的執行計劃(轉)SQLOracle
- oracle中開啟執行計劃Oracle
- SQL的執行計劃SQL
- 執行計劃的理解.
- in list查詢計算cost
- bitmap to rowid執行計劃下的基數計算疑問
- oracle sqlprofile 固定執行計劃,並遷移執行計劃OracleSQL