Oracle 11g 针对SQL性能的新特性(二)- Cardinality Feedback

Cardinality Feedback (CFB)


名词


Cardinality:
    优化器在计算成本的时候,需要从统计信息中取得数据,然后去估计每一步操作所涉及的行数,叫做Cardinality。
    比如,一张表T有1000行数据,列COL1上没有直方图,没有空值,并且不重复的值(distinct value)有500个。那么,在使用条件“WHERE COL1=<VALUE>”去访问表的时候,优化器会假设数据均匀分布,它估计出会有1000/500=2行被选出来,2就是这步操作的Cardinality。

    通常情况下,Cardinality越准确,生成的执行计划就会越高效。



适用情况


Oracle只针对下面情况开启CFB:

o 没有收集表的统计信息,并且dynamic sampling 也没有开启。
或者
o 查询条件复杂(比如条件有函数)或者涉及多列,但却没有收集扩展的统计信息(extended statistics)

在这几种情况下,CBO是无法估算出准确的Cardinality的。



过程描述


1. 针对上述情况,Oracle会监控操作的实际行数(A-Row),然后对比CBO估算的行数(E-Row)。
2. 如果两个值相差很大,就记录实际行数(A-Row),做上标记。下次执行时再次进行硬解析,根据实际行数来重新生成执行计划。
3. 如果两个值相差不大,CBO就不再监控这条SQL语句。



验证


如果你在执行计划的最后看到下面这段文字,说明这个执行在生成时启用了CFB。

Note
-----
- cardinality feedback used for this statement


禁用



如果你被这个特性困扰,那么可以把它关闭。 具体操作请参考Note 1344937.1

参考


Cardinality Feedback - Frequently Asked Questions (Doc ID 1344937.1)


















评论:

1000/500=20....2行才對吧...

发表于 guest 在 2013年10月14日, 01:01 下午 CST #

typo, 谢谢指正 ;)

发表于 Roger Song 在 2013年10月15日, 02:35 下午 CST #

发表一条评论:
  • HTML语法: 禁用
About

本博客由Oracle全球技术支持中国区的工程师维护。为中文用户提供数据库相关的技术支持信息,包括常用的诊断工具、诊断方法、产品新特性、案例分析等。此外,MOS也陆续推出各类中文内容:技术通讯统一发布在Note 1529795.1 中,中文文档列表更新在Note 1533057.1 中,网上讲座请查看MOS文档 1456176.1,在"Archived"中可以下载历史的录音和文档。

Search

Archives
« 四月 2014
星期日星期一星期二星期三星期四星期五星期六
  
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今天