oracle 扩展统计信息简单说明
只有当谓词条件中使用了未经修改的列值时,上一节中描述的列统计信息和直方图才会起作用。例如,如果使用了谓词country='Switzerland',通过country列上适当的列统计信息和直方图,查询优化器应该能够正确估算它的选择率。这是因为列统计信息和直方图描述的是country列自身的值。
另一方面,如果使用了谓词upper(country)='SWITZERLAND',查询优化器就不再能够直接从对象统计信息和直方图中推断出选择率了。当一个谓词条件引用了多个列时也会出现类似的问题。举个例子,如果将谓词条件country='Denmark' AND language='Danish'应用到一张包含全世界人口信息的表上,则很可能这两个限制条件都应用到了表中大多数记录的相同记录上了。
实际上,大多数讲丹麦语的人生活在丹麦,生活在丹麦的大多数人讲丹麦语。换句话说,这两个限制条件几乎是冗余的。这样的列通常称作关联列(correlated column),并且它们会对查询优化器造成挑战。这是因为没有任何对象统计信息或者直方图描述这样互相依赖的数据,或者换句话说,查询优化器实际上是假设存储在不同列中的数据没有相互依赖关系。
自11.1版本开始,就可以做到基于表达式或者一组列来收集对象统计信息和直方图来解决这样的问题。这些新的统计信息称作扩展统计信息。这背后其实主要就是根据一个表达式或者一组列来创建一个叫作扩展信息的隐藏列。然后就在这个隐藏列上收集对象统计信息和直方图。
这个概念通过dbms_stats包的create_extended_stats函数来实现。例如,通过接下来的查询创建两个表达式。第一个是在upper(pad)上,第二个是由列val2和val3组成的一个列组。在测试表中,这些列包含完全一样的值;换句话说,这些列是高度关联的(实际上是完全关联的)。根据定义,如下面要展示的,表达式或这组列必须包含在一对圆括号中。注意,这个函数返回的是由系统生成的扩展信息名称(一个由SYS_STU开头的30个字节的名称):
SELECT dbms_stats.create_extended_stats(ownname => user,