Oracle数据库SQL优化基本概念扩展统计信息01

运维数据库时,可能会遇到以下两类问题:

问题一:

查询语句,谓词有单个列,优化器预估Cardinality基数相对准确,谓词有多个列时,优化器预估Cardinality基数不准确,从而导致无法生成最优的执行计划。

问题二:

谓词列引用了函数,导致优化器无法正确预估列真实使用情况,如果不创建函数索引,是否还有其他方法提高准确度?

以上两个问题,有时可以通过添加Extended Statistics扩展统计信息来解决。

Extended Statistics:

1.Column Group Statistics

当查询的WHERE子句指定单个表中的多个列(多个单列谓词)时,列之间的关系会强烈影响列组的组合选择性。

2.Expression Statistics

当一个函数应用于查询的WHERE子句中的列(function(col1)=constant)时,优化器无法知道该函数如何影响列的选择性。

通过收集表达式函数(col1)的expression statistics,优化器可以获得更准确的选择性值。

测试过程如下:

创建测试表calendar,包含四个列,分别为月、日、星期、星座。

    create table calendar(month_name int,day_name int,week_name int,star_sign varchar(10));
    insert into calendar values(1,1,1,'摩羯座');
    insert into calendar values(1,2,2,'摩羯座');
    insert into calendar values(1,20,6,'摩羯座');
    insert into calendar values(2,22,4,'水瓶座');
    insert into calendar values(3,6,3,'双鱼座');
    insert into calendar values(4,9,2,'白羊座');
    insert into calendar values(5,12,7,'金牛座');
    insert into calendar values(6,3,1,'双子座');
    insert into calendar values(7,11,4,'巨蟹座');
    insert into calendar values(8,5,1,'狮子座');
    insert into calendar values(9,7,2,'处女座');
    insert into calendar values(10,8,3,'天秤座');
    insert into calendar values(11,15,5,'天蝎座');
    insert into calendar values(12,1,5,'射手座');
    insert into calendar values(12,5,4,'射手座');
    ......
    COMMIT;