设为首页 加入收藏

TOP

CBO之FullTableScan-FTS算法(一)
2015-07-24 10:44:33 来源: 作者: 【 】 浏览:3
Tags:CBO FullTableScan-FTS 算法
1、建表
SQL> create table gyj_t1(id int,name varchar2(20));
?
Table created.
?
2、插入10万行数据
SQL> begin
  for i in 1 .. 100000 loop
 insert into gyj_t1 values(i,lpad(‘gyj‘,‘10‘,‘j‘)||i);
 commit;
end loop;
end;
/

PL/SQL procedure successfully completed.

?

3、收集统计信息
SQL> BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
ownname => ‘GYJ‘,
 tabname => ‘GYJ_T1‘,
estimate_percent => 100,
 method_opt => ‘for all columns size 1‘,
degree => DBMS_STATS.AUTO_DEGREE,
 cascade=>TRUE
  );
 END;
/

PL/SQL procedure successfully completed.

/

?

?
4、执行SQL,生成执行计划,即能看到如下全表扫描的成本
SQL> set autot traceonly;
SQL> select count(*) from gyj_t1;


Execution Plan
----------------------------------------------------------
Plan hash value: 2553183190

---------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    84   (2)| 00:00:02 |
|   1 |  SORT AGGREGATE    |        |     1 |            |          |
|   2 |   TABLE ACCESS FULL| GYJ_T1 |   100K|    84   (2)| 00:00:02 |
---------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        373  consistent gets
          0  physical reads
          0  redo size
        526  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)

?

?
5、全表扫描CBO公式
FTS Cost = I/O Cost + CPU Cost
I/O Cost = 1 + CEIL(#MRds * (mreadtim / sreadtim))
#MRds = #Blks / MBRC
CPU Cost = ROUND(#CPUCycles / cpuspeed / 1000 / sreadtim)
?
6、#MRds
#MRds = #Blks / MBRC
(1)#Blks
SQL> select blocks from dba_tables where owner=‘GYJ‘ and table_name=‘GYJ_T1‘;
?
? ? BLOCKS
----------
? ? ? ?370
?
(2)多块读的参数
SQL> show parameter db_file_multiblock_read_count
?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ?VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count ? ? ? ?integer ? ? 16
?
?
(3)#MRds
SQL> select 370/16 from dual;
?
? ?370/16
----------
?23.125
?
7、mreadtim
?
?
SQL> select (select pval1 from sys.aux_stats$ where pname = ‘IOSEEKTIM‘) +
           (select value
               from v$parameter
     where name = ‘db_file_multiblock_read_count‘) *
    (select value from v$parameter where name = ‘db_block_size‘) /
     (select pval1 from sys.aux_stats$ where pname = ‘IOTFRSPEED‘) "mreadtim"
     from dual;

  mreadtim
----------
        42

即mreadtim=ioseektim+db_file_multiblock_count*db_block_size/iotftspeed
        =10+16*8192/4096=42

?

?
8、sreadtim
SQL> select (select pval1 from sys.aux_stats$ where pname = ‘IOSEEKTIM‘) +
           (select value from v$parameter where name = ‘db_block_size‘) /
           (select pval1 from sys.aux_stats$ where pname = ‘IOTFRSPEED‘) "sreadtim"
      from dual;

  sreadtim
----------
        12
即 sreadtim=ioseektim+db_block_size/iotfrspeed
        =10+8192/4096=12

?

?
?
(9)#CPUCycles
explain plan for select count(*) from GYJ_T1;
SQL> select cpu_cost from plan_table;
CPU_COST
----------
  17634933

?

?
? ?
(10)CPUSPEEDNW
SQL> select pname, pval1 from sys.aux_stats$ where sname=‘SYSSTATS_MAIN‘;

PNAME                               PVAL1
-------------
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇统计信息不准导致执行计划出错跑.. 下一篇SYBASE:sybase基础

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)