影响CBO计算代价的系统参数
1. OPTIMIZER_INDEX_COST_ADJ:调整优化器在选择访问路径时更趋于使用索引还是使用全表扫描.缺省值100(即100%,百分比系数)表示按照常规方式计算索引访问路径.若为其他值,表示在计算得出的常规索引代价基础上乘以该百分比系数,使得其索引代价更少或更多.如:设置为50,表示索引访问代价是正常索引代价的50%,使得系统更偏向于使用索引.在OLTP环境,可以设定此值小于100.2. OPTIMIZER_INDEX_CACHING[@more@]设置非0值,将使得CBO更倾向于使用嵌套循环(Nested loop)和IN-LIST.定义了优化器假定索引块在内存中的百分比.设置此参数为高值,导致优化器更
CBO 统计值存放和 字符串的selectivity 计算
oracle 统计数据存放于:user_tables, user_tab_columns, user_tab_cols(including virtual columns), user_tab_histograms.计算selectivity / cardnality 非常重要。提供user_tab_columns.low_value和user_tab_columns.high_value的转换函数。 字符串做范围查找时,需要根据编码转换成数字,提供此函数cbo_char_value。[@more@]自定义函数:VALUE_TO_DATEVALUE_TO_NUMBERVALUE_TO_VARCHAR2cbo_char_valueSQL> desc t1 ?? ????? ?? ----------------------------------------- -------- --------
number/date/varchar2类型字段做range scan 的selectivity计算
oracle按照standard formula计算cost,当对于number/date类型字段做range scan, oracle都可以得到比较准确的selectivity. (之所以说是比较准确而非正确,因为虽然我们的数字、日期实际是离散的,但oracle optimizer认为是连续的,所以我们想查询2002-12-30-2003-01-05在2000-2004年(共1827天)中的selectivity,期望是7/1827,但oracle并不会这样计算)。[@more@]若以number类型存储年月日yyyymmdd 计算结果为:standard fomula:selectivity=(required range) / (high value - low value) + 2/num_distinct=(20030105-20021230)/(20041