转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/44261859

***********************************************
    一、CBO之Full Table Scan - FTS算法
***********************************************

1、建表
SQL> create table gyj_t1(id int,name varchar2(20));

Table created.

2、插入10万行数据
SQL> begin
  2   for i in 1 .. 100000 loop
  3    insert into gyj_t1 values(i,lpad('gyj','10','j')||i);
  4    commit;
  5  end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

3、收集统计信息
SQL> BEGIN
  2  DBMS_STATS.GATHER_TABLE_STATS(
  3  ownname => 'GYJ',
  4  tabname => 'GYJ_T1',
  5  estimate_percent => 100,
  6  method_opt => 'for all columns size 1',
  7  degree => DBMS_STATS.AUTO_DEGREE,
  8  cascade=>TRUE
  9  );
 10  END;
 11  /

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') +
  2         (select value
  3             from v$parameter
  4   where name = 'db_file_multiblock_read_count') *
  5  (select value from v$parameter where name = 'db_block_size') /
  6   (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "mreadtim"
  7   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') +
  2         (select value from v$parameter where name = 'db_block_size') /
  3         (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "sreadtim"
  4    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
------------------------------ ----------
CPUSPEEDNW                     2894.14695
IOSEEKTIM                              10
IOTFRSPEED                           4096
SREADTIM
MREADTIM
CPUSPEED
MBRC
MAXTHR
SLAVETHR

(11)隐含參数:
SQL> @?/rdbms/admin/show_para
Enter value for p: table_scan_cost
old  12:     AND upper(i.ksppinm) LIKE upper('%&p%')
new  12:     AND upper(i.ksppinm) LIKE upper('%table_scan_cost%')

P_NAME                                   P_DESCRIPTION                                      P_VALUE                          ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- -------------------------------------------------- ------------------------------ --------- ---------- -----
_table_scan_cost_plus_one                bump estimated full table scan and index ffs cost  TRUE    TRUE      FALSE       FALSE
                                         by one

(12)IO成本
I/O Cost = 1 + CEIL(#MRds * (mreadtim / sreadtim))
/O Cost = 1 + CEIL(23.125 * ((10+16*8192/4096) / (10+8192/4096)))
SQL> select 1 + CEIL(23.125 * ((10+16*8192/4096) / (10+8192/4096))) from dual;

1+CEIL(23.125*((10+16*8192/4096)/(10+8192/4096)))
-------------------------------------------------
                                           82

(13)CPU成本
CPU Cost = ROUND(#CPUCycles / cpuspeed / 1000 / sreadtim)
           ROUND(17634933/ 2894.14695 / 1000 / (10+8192/4096))=1

CBO之Full Table Scan - FTS算法的更多相关文章

  1. Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过row ...

  2. 转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

    0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Us ...

  3. 表访问方式---->全表扫描(Full Table Scans, FTS)

    全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...

  4. Graham Scan凸包算法

    获得凸包的算法可以算是计算几何中最基础的算法之一了.寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包. 首先介绍一下二维向量的 ...

  5. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  6. 怎样看懂Oracle的执行计划

    怎样看懂Oracle的执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when ...

  7. Oracle SQL优化一(常见方法)

    1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...

  8. Oracle数据库查看执行计划

    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  9. 查看oracle的执行计划

    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

随机推荐

  1. apt-get update 报错 W: Unknown Multi-Arch type 'no' for package 'compiz-core'

    源 #deb包 deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http:// ...

  2. C# html table转excel

    1. protected void ebtDC_Click(object sender, EventArgs e) { string elxStr = "<table><t ...

  3. HDU4415 Assassin’s Creed

    题目大意:有n个人,每个人有x,y两个值.x代表干掉他得到的分数,分数和不超过m;y代表干掉他后你能额外干掉多少个,且不计入总分. 求干掉人数最多为多少,以及最小的分. ~~~~~~~~~~~~~~~ ...

  4. [LUOGU] P1113 杂物

    题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为 ...

  5. 21Spring重用切点表达式

    直接看代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalculator { int add(in ...

  6. express中间件的意思

    中间件就是请求req和响应res之间的一个应用,请求浏览器向服务器发送一个请求后,服务器直接通过request定位属性的方式得到通过request携带过去的数据,就是用户输入的数据和浏览器本身的数据信 ...

  7. Java面向对象学习-----类的成员变量

    类的成员变量: 猜数字游戏:一个类A有一个成员变量v,通过随机产生一个100内的整数给v赋值.定义一个方法,对A类的成员变量v进行猜.   没有猜对的情况下提示如果大了则提示大了,小了则提示小了,并且 ...

  8. Maven 引入外部包

    当需要从外部引入一个包(譬如说读写Excel 的POI  jar 包 ), 不需要手动地去官网下载一个包然后粘贴到相应的地方. 只需要把Java 工程 转为 Maven 工程 ( 在工程上右键 > ...

  9. csu - 1537: Miscalculation (模拟题)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1537 因为给出的式子是必定合法的,只要用两个栈分别保存符号和数字.算出答案后和从左至右算的答案比对 ...

  10. cogs——7. 通信线路

    7. 通信线路 ★★   输入文件:mcst.in   输出文件:mcst.out   简单对比时间限制:1.5 s   内存限制:128 MB 问题描述 假设要在n个城市之间建立通信联络网,则连通n ...