oracle cost計算方式

wengtf發表於2011-09-18

--------------資料庫版本
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
其中cpucycles的值根據plan_table中的cpu_cost來獲得

cpu_cost=cpucycles/(cpuspeed*sreadtim)

-------------執行一個查詢
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/22907091/viewspace-707809/,如需轉載,請註明出處,否則將追究法律責任。

相關文章