执行计划的cardinality基数(rows)评估

编程入门 行业动态 更新时间:2024-10-13 00:31:16

执行计划的cardinality<a href=https://www.elefans.com/category/jswz/34/1738537.html style=基数(rows)评估"/>

执行计划的cardinality基数(rows)评估


执行计划的cardinality基数(rows)评估:


         执行计划的cardinality列(基数)是说从数据表结果集或者索引返回多少行数据。

基数=表行数据*选择率。所以讲基数重点是讲选择率,选择率的计算!

         Cardinality的值对于CBO做出正确的执行计划来说至关重要。 如果CBO获得的Cardinality值不够准确(通常是没有做过分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致CBO错误的制定出执行计划。

        

         如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,执行获取的执行计划可能会出现偏差,可能是正确的执行计划也可能是错误的执行计划。

 

         如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而也可能导致错误的执行计划。

        

         查询sql访问的谓词如果超出了数据库中统计信息记录的值限,比如,某个数值范围是1~100,当访问200的取值,超出了这个范围,由于统计信息收集通常是通过采样,定时来实现的,所以真实的数据中可能仍然存在满足条件的数据,这时数据库会估算指定一个density(比重)用于cardinality的计算。

 

 

----查询sql访问的谓词超出了数据库中统计信息记录的值限分析实验:

1.环境准备

sys@ORCL>create user shall identified by shall;

User created.

 

sys@ORCL>grant connect,resource to shall;

sys@ORCL>grant dba to shall;

Grant succeeded.

 

shall@ORCL>create table zhong as select rownum numid from dba_objects where rownum<20001;

 

shall@ORCL>insert into zhong select * from zhong;

20000 rows created.

shall@ORCL>insert into zhong select * from zhong;

40000 rows created.

shall@ORCL>insert into zhong select * from zhong;

80000 rows created.

shall@ORCL>commit;

Commit complete.

 

2.收集该表统计信息

shall@ORCL>exec dbms_stats.gather_table_stats(user,'ZHONG');

PL/SQL procedure successfully completed.

 

----查询记录一下相关的统计信息

shall@ORCL>select table_name,num_rows,blocks,avg_row_len,sample_size from user_tables where table_name='ZHONG';

 

TABLE_NAME                       NUM_ROWS     BLOCKS AVG_ROW_LEN SAMPLE_SIZE

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

ZHONG                              160000        249           4      160000

 

shall@ORCL>select column_name,data_type,num_distinct,density,1/num_distinct,last_analyzed,sample_size,histogram from user_tab_cols where table_name='ZHONG';

COLUMN_NAME DATA_TYPE   NUM_DISTINCT    DENSITY 1/NUM_DISTINCT LAST_ANALYZED       SAMPLE_SIZE HISTOGRAM

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

NUMID       NUMBER             20128 .000049682     .000049682 2016-05-28 16:25:44      160000 NONE

 

------注意以上的density(比重)计算,在不存在柱状图时,density=1/num_distinct,此时计算cardinality(基数)时,会选择使用公式:

cardinalily=num_rows/num_distinct=num_rows*(1/num_distinct)

 

3.数据库中的基本信息如下

shall@ORCL>select max(numid) from zhong;

MAX(NUMID)

----------

     20000

shall@ORCL>select count(*) from zhong;

  COUNT(*)

----------

    160000

shall@ORCL>select count(*) from zhong where numid=1000;

  COUNT(*)

----------

         8

 

4.开启10053事件跟踪查询

shall@ORCL>alter session set events '10053 trace name context forever,level 1';

Session altered.

 

shall@ORCL>explain plan for select count(*) from zhong where numid=1000;

Explained.

shall@ORCL>explain plan for select count(*) from zhong where numid=10000;

Explained.

更多推荐

执行计划的cardinality基数(rows)评估

本文发布于:2024-03-04 13:41:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709411.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:基数   计划   cardinality   rows

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!