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;