noworkload下全表掃描cost的計算
--------------資料庫版本
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
---------------表資訊
表塊數-------64157
_db_file_optimizer_read_count=16--------------真正計算cost的時候是按照這個塊來計算,非db_file_multiblock_read_count
db_file_multiblock_read_count=16
-----------系統統計資訊(noworkload統計資訊)
SQL> select
2 pname, pval1
3 from
4 sys.aux_stats$;
PNAME PVAL1
------------------------------ ----------
CPUSPEEDNW 833.212
IOSEEKTIM 10
IOTFRSPEED 4096
------------cost計算公式,cost=io_cost+cup_cost
io_cost=(總塊數/mbrc)*(mreadtim/sreadtim)
這裡的mbrc即為_db_file_optimizer_read_count的值。
sreadtim=ioseektim + db_block_size/iotrfrspeed=10+8192/4096=12
mreadtim=ioseektim+(db_file_multiblock_read_count* db_block_size)/iotrfrspeed==12+(16*8192)/4096=42
cpu_cost=cpu_cost=cpucycles/(cpuspeed*sreadtim)
其中cpucycles的值根據plan_table中的cpu_cost來獲得
-------------執行一個查詢
SQL> select count(*) from wxh_tbd;
COUNT(*)
----------
448497
執行計劃
----------------------------------------------------------
Plan hash value: 853361775
----------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14088 (1)| 00:02:50 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| WXH_TBD | 448K| 14088 (1)| 00:02:50 |
----------------------------------------------------------------------
我們看看這個cost是如何計算出來的。
io_cost=(總塊數/mbrc)*(mreadtim/sreadtim)
=(64157/16)*(42/12)=14036
cpu_cost=cpucycles/(cpuspeed*sreadtim)=524164776/(833.212*12*1000)=52.4241106
總cost=14036+52=14088
跟oracle計算出來的是一致的。
SQL> select * from v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
---------------表資訊
表塊數-------64157
_db_file_optimizer_read_count=16--------------真正計算cost的時候是按照這個塊來計算,非db_file_multiblock_read_count
db_file_multiblock_read_count=16
-----------系統統計資訊(noworkload統計資訊)
SQL> select
2 pname, pval1
3 from
4 sys.aux_stats$;
PNAME PVAL1
------------------------------ ----------
CPUSPEEDNW 833.212
IOSEEKTIM 10
IOTFRSPEED 4096
------------cost計算公式,cost=io_cost+cup_cost
io_cost=(總塊數/mbrc)*(mreadtim/sreadtim)
這裡的mbrc即為_db_file_optimizer_read_count的值。
sreadtim=ioseektim + db_block_size/iotrfrspeed=10+8192/4096=12
mreadtim=ioseektim+(db_file_multiblock_read_count* db_block_size)/iotrfrspeed==12+(16*8192)/4096=42
cpu_cost=cpu_cost=cpucycles/(cpuspeed*sreadtim)
其中cpucycles的值根據plan_table中的cpu_cost來獲得
-------------執行一個查詢
SQL> select count(*) from wxh_tbd;
COUNT(*)
----------
448497
執行計劃
----------------------------------------------------------
Plan hash value: 853361775
----------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 14088 (1)| 00:02:50 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| WXH_TBD | 448K| 14088 (1)| 00:02:50 |
----------------------------------------------------------------------
我們看看這個cost是如何計算出來的。
io_cost=(總塊數/mbrc)*(mreadtim/sreadtim)
=(64157/16)*(42/12)=14036
cpu_cost=cpucycles/(cpuspeed*sreadtim)=524164776/(833.212*12*1000)=52.4241106
總cost=14036+52=14088
跟oracle計算出來的是一致的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-695364/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle實驗記錄 (全表掃描COST計算方法)Oracle
- 計算表掃描中執行計劃的COST
- 全表掃描的cost 與 索引掃描Cost的比較 – 無直方圖(10.1.0.3以後)索引直方圖
- oracle實驗記錄(分割槽全表掃描(全區掃描) FTS 時候的成本計算)Oracle
- MySQL中的全表掃描和索引樹掃描MySql索引
- 優化全表掃描優化
- delete 與全表掃描delete
- 查詢全表掃描的sqlSQL
- 使用索引快速全掃描(Index FFS)避免全表掃描的若干場景索引Index
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- ORACLE全表掃描查詢Oracle
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- 抓取全表掃描的表,篩選和分析
- 索引全掃描和索引快速全掃描的區別索引
- 查詢全表掃描語句
- oracle優化:避免全表掃描Oracle優化
- oracle是如何進行全表掃描的Oracle
- 優化Oracle with全表掃描的問題優化Oracle
- (轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- 轉)索引掃描還是全表掃描(Index Scan Or Full Table Scan)索引Index
- delete 刪除資料 全表掃描還是掃描所有塊的測試delete
- 一條全表掃描sql語句的分析SQL
- 優化Oracle with全表掃描的問題(二)優化Oracle
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 使用全表掃描快取大表的相關問題快取
- 有索引卻走全表掃描的實驗分析索引
- 【MySQL】全索引掃描的bugMySql索引
- mysql下建立索引讓其index全掃描MySql索引Index
- oracle實驗記錄 (分割槽表,掃描基數的計算)Oracle
- 隱形轉換導致全表掃描案例
- 關於分割槽表中的全partition掃描問題
- oracle sql tuning 8--優化全表掃描OracleSQL優化
- PostgreSQL DBA(55) - MVCC#8(對全表掃描的影響)SQLMVCC#
- 累計的力量,delete全表掃描導致程式執行時間過長。delete
- Oracle中ASSM模式下,全表掃描的L3塊的邏輯讀的影響OracleSSM模式
- 23_Oracle資料庫全表掃描詳解(三)Oracle資料庫
- 22_Oracle資料庫全表掃描詳解(二)Oracle資料庫
- 21_Oracle資料庫全表掃描詳解(一)Oracle資料庫