(2010-08-21)ORACLE的CBO及表分析

(1)什么是表分析

  什么是表分析?简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以优化。在CBO中,如果有统计数据(即对表与索引进行了分析),则优化器会自动根据cost值决定采用哪种连接类型,并选择合适的Oracle驱动表,这与where子句中各个限制条件的位置没有任何关系。如何查看一张表是否分析过呢?

 记得在Q群里也曾有人问过这样的问题,有人回答是:查询dba_tables中的last_analyzed字段。

 记得042也有这样一道题:如何看一个表是否分析过?
  答案有三个:
 A.average row size
 B.last analyzed date
 D:size of the table in database block;
对于这道题,A和D这两个问题我想不明白为什么也是正确答案,看看ITPUB上别人的解释吧

1. 最准确的答案是B: last analyzed date, 表示该对象最后被分析的时间.
2. D: size of the table in database block; 这个答案也可以理解,
因为 blocks = dba_segments.bytes / block_size
如果这个等式的两边能够相等, 也可以表示该表的统计信息是比较真实的反应数据的, 那么该表也就是分析过的.
3. A: average row size 这个答案我实在不能理解, 等待高手指点.
实际用analyze或dbms_stats包做统计表的的分析,分析可以判断表的使用情况,比如行迁移情况等.之前看看这个表的情况,主要是各列的数据.

实验数据如下:

SQL> create table test1(id int);
 
Table created
 
SQL> insert into test1 values(1);
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from test1;
 
                                     ID
---------------------------------------
                                      1
 
SQL> select * from dba_tables where table_name='TEST1';
 
OWNER                          TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME                   IOT_NAME                       STATUS     PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS LOGGING BACKED_UP   NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS DEGREE               INSTANCES            CACHE      TABLE_LOCK SAMPLE_SIZE LAST_ANALYZED PARTITIONED IOT_TYPE     TEMPORARY SECONDARY NESTED BUFFER_POOL ROW_MOVEMENT GLOBAL_STATS USER_STATS DURATION        SKIP_CORRUPT MONITORING CLUSTER_OWNER                  DEPENDENCIES COMPRESSION DROPPED
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ -------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------- --------- ---------- ---------- ------------ ---------- ---------- ----------- ------------------------- ------------------- -------------------- -------------------- ---------- ---------- ----------- ------------- ----------- ------------ --------- --------- ------ ----------- ------------ ------------ ---------- --------------- ------------ ---------- ------------------------------ ------------ ----------- -------
SCOTT                          TEST1                          USERS                                                                                        VALID            10                     1        255          65536                       1  2147483645                                         YES     N                                                                                                                                     1                    1               N      ENABLED                              NO                       N         N         NO     DEFAULT     DISABLED     NO           NO                         DISABLED     YES                                       DISABLED     DISABLED    NO
 
SQL> analyze table test1 compute statistics;
 
Table analyzed
 
SQL> select * from dba_tables where table_name='TEST1';
 
OWNER                          TABLE_NAME                     TABLESPACE_NAME                CLUSTER_NAME                   IOT_NAME                       STATUS     PCT_FREE   PCT_USED  INI_TRANS  MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS LOGGING BACKED_UP   NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS DEGREE               INSTANCES            CACHE      TABLE_LOCK SAMPLE_SIZE LAST_ANALYZED PARTITIONED IOT_TYPE     TEMPORARY SECONDARY NESTED BUFFER_POOL ROW_MOVEMENT GLOBAL_STATS USER_STATS DURATION        SKIP_CORRUPT MONITORING CLUSTER_OWNER                  DEPENDENCIES COMPRESSION DROPPED
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ -------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- ------- --------- ---------- ---------- ------------ ---------- ---------- ----------- ------------------------- ------------------- -------------------- -------------------- ---------- ---------- ----------- ------------- ----------- ------------ --------- --------- ------ ----------- ------------ ------------ ---------- --------------- ------------ ---------- ------------------------------ ------------ ----------- -------
SCOTT                          TEST1                          USERS                                                                                        VALID            10                     1        255          65536                       1  2147483645                                         YES     N                  1          5            3       8071          0           6                         0                   0          1                    1               N      ENABLED              1 2010-08-21 17 NO                       N         N         NO     DEFAULT     DISABLED     NO           NO                         DISABLED     YES                                       DISABLED     DISABLED    NO
 
注:

Driving Table(驱动表)

  该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有限制条件(如等值限制),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行计划中,应该为靠上的那个row source,后面会给出具体说明。在我们后面的描述中,一般将该表称为连接操作的row source 1。

  Probed Table(被探查表)

  该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source 2。

       select * from dba_tables where table_name='TEST11';
       analyze table test11 compute statistics;
       再查询表dba_tables,你就会发现问题了.
       select * from dba_tables where table_name='TEST11';(备注:表名要大写)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值