• oracle表分析


    概述

    当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息。 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这些信息进行计算,分析,评估,最终得出一个成本最低的执行计划。

    所以对于CBO,数据段的分析就非常重要。

    分析SQL

    analyze table tablename compute statistics

    等同于

    analyze table tablename compute statistics for table for all indexes for all columns
    1

    for table的统计信息存在于视图:user_tables 、all_tables、dba_tables

    for allindexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes

    for allcolumns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
    或者

    SQL> exec dbms_stats.gather_table_stats(user,'xiaogongjiang');
    1

    生成的统计信息会存在于user_tables这个视图,查看一下

    select * from user_tables where table_name=table_name;
    1

    观察一下NUM_ROWS,BLOCKS,AVG_SPACE,AVG_ROW_LEN几列你就会明白,这就是变化。

    删除SQL

    analyze table tablename delete statistics 会删除所有的statistics
    1

    作用

    oracle分析表的作用:为了使基于CBO的执行计划更加准确

    栗子

    数据准备

    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
    Connected as xx@xgj

    SQL> create table xiaogongjiang as select a.OBJECT_ID ,a.OBJECT_NAME from dba_objects a ;--创建表

    Table created

    SQL> select count(1) from xiaogongjiang;

    COUNT(1)
    ----------
    35183

    SQL> create index idx_object_id on xiaogongjiang(object_id);--在object_id建立索引

    Index created

    SQL>
    1
    2

    分析前的数据及执行计划


    SQL> select num_rows, avg_row_len, blocks, last_analyzed from user_tables where table_name = 'XIAOGONGJIANG';--表的信息

    NUM_ROWS AVG_ROW_LEN BLOCKS LAST_ANALYZED
    ---------- ----------- ---------- -------------


    SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='XIAOGONGJIANG';--索引信息

    BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED
    ---------- ----------- ------------- -------------

    1
    2

    从查询结果看出,表的行数,行长,占用的数据块数及最后的分析时间都是空。 索引的相关信息也没有,说明这个表和说因都没有被分析,如果此时有一条SQL 对表做查询,CBO 由于无法获取这些信息,很可能生成错误的执行计划。

    查询执行计划

    --执行sql,以便存到shared pool中
    SQL>select /*+dynamic_sampling(xiaogongjiang 0) */ * from XIAOGONGJIANG where object_id>30;
    .....省略输出

    -- 查询出上个执行脚本对应的sql_id:5h16pnkvs0r5z
    SQL>select * from v$sql a where a.SQL_TEXT like '%select /*+dynamic_sampling(xiaogongjiang 0) */ * from XIAOGONGJIANG where object_id>30%';
    .....省略输出

    --使用dbms_xplan.display_cursor查看sql真正的执行计划
    SQL>select * from table(dbms_xplan.display_cursor('5h16pnkvs0r5z'));

    导出html,查看如下

    这里写图片描述

    在Oracle 10g以后,如果一个表没有做分析,数据库将自动对它做动态采样分析,

    所以这里采用hint的方式将动态采样的级别设置为0,即不使用动态采样。

    分析后的数据及执行计划

    第一种方式

    SQL> analyze table xiaogongjiang compute statistics ;

    Table analyzed


    第二种方式(推荐)

    SQL> exec dbms_stats.gather_table_stats(user,'xiaogongjiang');

    PL/SQL procedure successfully completed

    SQL> 第一个参数为用户,第二个参数为表

    通过DBMS_STATS包来分析,从9i 开始,Oracle 推荐使用DBMS_STATS包对表进行分析操作,因为DBMS_STATS 提供了更多的功能,以及灵活的操作方式。

    SQL> select num_rows, avg_row_len, blocks, last_analyzed from user_tables where table_name = 'XIAOGONGJIANG';

    NUM_ROWS AVG_ROW_LEN BLOCKS LAST_ANALYZED
    ---------- ----------- ---------- -------------
    35183 27 152 2016-12-02 0:


    SQL> select blevel,leaf_blocks,distinct_keys,last_analyzed from user_indexes where table_name='XIAOGONGJIANG';

    BLEVEL LEAF_BLOCKS DISTINCT_KEYS LAST_ANALYZED
    ---------- ----------- ------------- -------------
    1 77 35180 2016-12-02 0:

    从上面的结果,可以看出DBMS_STATS.gather_table_stats已经对表和索引都做了分析。 现在我们在来看一下执行计划。

    SQL>select * from xiaogongjiang where object_id>30;

    SQL>select * from v$sql a where a.SQL_TEXT like '%select * from xiaogongjiang where object_id>30%';

    SQL>select * from table(dbms_xplan.display_cursor('gzspgs4btcpuf'));

    这里写图片描述

    从这个计划,我们看出CBO 估算出的结果是35153条记录,与实际的35183很近。 此时选择全表扫描更优。 通过这个例子,我们也看出了分析对执行计划的重要性。

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/timlong/p/7456552.html
Copyright © 2020-2023  润新知