Oracle的扩展统计信息特性是怎样的

网友投稿 209 2023-12-13

Oracle的扩展统计信息特性是怎样的

本篇文章给大家分享的是有关Oracle的扩展统计信息特性是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Oracle的扩展统计信息特性是怎样的

oracle 11g在统计信息收集方面增加了扩展统计信息的特性,它可以收集一个表中相关列上的统计信息,也可以收集函数表达式上的统计信息.使选择率,成本的估计更加准确,也更容易走正确的执行计划.在相关列上收集统计信息,好处还是很明显的.例如两列在逻辑上有一定的关系,但如果只是对这两个列单独做统计信息的收集,根据多条件的选择率计算{ (A AND B的选择率为:OPSEL[a]*OPSEL[b]); (A OR B 的选择率为:OPSEL[a]+OPSEL[b]-OPSEL[a]OPSEL[b]); (NOT A的选择率为:1-OPSEL[a])},

估算出来的选择率就可能偏差很大.

可以针对关联列或者表达式

来收集扩展统计信息。关联列是指,假设有个世界人口表,使用谓词country = Denmark and language = Danish, 对于这张表中的大部分记录来讲,这两个限制条件很可能适用于同一批记录。事实上,说丹麦语的人大部分住在丹麦,大部分住在丹麦的人说丹麦语。也就是说,这两个约束条件几乎是冗余的,这样的列通常被叫做关联列(correlated column), 也给优化器出了难题。这是因为,没有对象统计信息或者直方图来描述数据之间的依赖关系。换句话说,查询优化器实际上假定存储在不同列上的数据是不相关的。

以下测试:

DB Version:11.2.0.4

----产生测试数据

drop table scott.test01 purge;

create table scott.test01 as select * from dba_objects;

--把object_name 更新为和object_type一样,用于测试.

update scott.test01 set object_name=object_type;

commit;

1.收集单列统计信息,查看执行计划

--收集单列统计信息

exec dbms_stats.gather_table_stats(SCOTT,TEST01);

--查看表的行数

select  table_name,num_rows from dba_tables where owner = SCOTT and table_name = TEST01;

TABLE_NAME                       NUM_ROWS

------------------------------ ----------

TEST01                              87048

--产生语句的执行计划

explain plan for select * from scott.test01 where object_name=INDEX and object_type=INDEX;

SQL> select * from table(dbms_xplan.display());

这里可以看到,估算的返回行数是41,显然和实际相差很远--行数估算

select rpad(column_name, 30, ) column_name,

       rpad(num_distinct, 8, ) num_distinct,

       rpad(utl_raw.cast_to_varchar2(low_value), 15, ) low_value,

rpad(utl_raw.cast_to_varchar2(high_value), 10, ) high_value,

       rpad(num_nulls, 8, ) num_nulls,

rpad(avg_col_len, 6, ) avg_col_len,

       rpad(density, 20, ) density,

       histogram

  from dba_tab_col_statistics

where owner = SCOTT

   and table_name = TEST01

   and column_name in (OBJECT_NAME, OBJECT_TYPE);

SQL> col COLUMN_NAME for a15

SQL> col LOW_VALUE for a15

SQL> col HIGH_VALUE for a15

SQL> select rpad(column_name, 30, ) column_name,

  2         rpad(num_distinct, 8, ) num_distinct,

3         rpad(utl_raw.cast_to_varchar2(low_value), 15, ) low_value,

  4         rpad(utl_raw.cast_to_varchar2(high_value), 10, ) high_value,

5         rpad(num_nulls, 8, ) num_nulls,

  6         rpad(avg_col_len, 6, ) avg_col_len,

7         rpad(density, 20, ) density,

  8         histogram

  9    from dba_tab_col_statistics

 10   where owner = SCOTT

11     and table_name = TEST01

 12     and column_name in (OBJECT_NAME, OBJECT_TYPE);

估算的返回行数是41,是由两个列的density相乘再乘以表的行数得到,0.0217391304347826*0.0217391304347826*87048=41.1379962=41

2.收集多列扩展统计信息,查看执行计划

--收集多列扩展统计信息

exec dbms_stats.gather_table_stats(scott,test01,method_opt =>for columns (object_name,object_type));

--产生语句的执行计划

explain plan for select * from scott.test01 where object_name=INDEX and object_type=INDEX;

SQL> select * from table(dbms_xplan.display());

--查询实际返回行数:

SQL> select count(*) from scott.test01 where object_name=INDEX and object_type=INDEX;

  COUNT(*)

----------

      5078

这里可以看到,执行计划估算的返回行数是4986,已经基本上和实际返回行数5078相近了.

PS:

1.扩展统计信息的收集,可以用select dbms_stats.create_extended_stats(scott,test01,(object_name,object_type))from dual 方式创建扩展统计列, 然后dbms_stats.gather_table_stats(scott,test01) 收集统计信息 ;也可以直接在dbms_stats.gather_table_stats中的method_opt属性同时建立扩展统计收集统计数据

.例如如下:

dbms_stats.gather_table_stats(scott,test01,method_opt =>for columns (object_name,object_type));

2.oracle 11g不仅可以收集多列扩展统计信息,还可以收集函数和表达式的扩展统计信息.

以上就是Oracle的扩展统计信息特性是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:存储cache问题产生大量的log file导致数据库慢的解决办法
下一篇:银行系统建设与开发用户体验为什么重要?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~