• 为准确生成执行计划更新统计信息-analyze与dbms_stats


    如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息.

    例如索引跳跃式扫描(INDEX SKIP SCAN)例子中,如果不对表EMPLOYEE 及索引收集一下统计信息,就不是INDEX SKIP SCAN策略了。

    在oracle 8i以前,主要是用ANALYZE命令。在ORACLE 8I以后,又引入了DBMS_STATS存储包来进行分析。幸运的是从ORACLE 10G以后,分析工作变成自动的了,这减轻的DBA的负担

    分析统计信息

    analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。

    ---table统计信息
    analyze table EMP compute statistics for table;
    
    ---column统计信息
    analyze table EMP compute statistics for all columns;
    
    ---索引统计信息
    analyze table EMP compute statistics for all indexes;
    
    ---索引列统计信息
    analyze table EMP compute statistics for all indexed columns; 
    
    ---效果等于 analyze table tablename compute statistics for table for all indexes for all columns
    analyze table tablename compute statistics

    查看统计信息

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

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

    for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns

    SCOTT@PDBORCL> analyze table EMP compute statistics for table;
    表已分析。
    
    SCOTT@PDBORCL> analyze table EMP compute statistics for  all columns;
    表已分析。
    
    SCOTT@PDBORCL> analyze table EMP compute statistics for  all indexes;
    表已分析。
    
    SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
    
    TABLE_NAME    NUM_ROWS
    ----------- -----------
      EMP            14
    
    SCOTT@PDBORCL> select index_name,uniqueness  from user_indexes where table_name = 'EMP';
    
    INDEX_NAME   UNIQUENES
    --------    ---------
    PK_EMP       UNIQUE
    
    SCOTT@PDBORCL> select column_name,data_type  from user_tab_columns where table_name = 'EMP' ;
    
    COLUMN_NAME   DATA_TYPE 
    -------------------------
    EMPNO        NUMBER
    ENAME        VARCHAR2
    JOB          VARCHAR2
    MGR          NUMBER
    HIREDATE     DATE
    SAL          NUMBER
    COMM         NUMBER
    DEPTNO       NUMBER
    
    
    已选择 8 行。
    
    SCOTT@PDBORCL> ^A

    删除统计信息

    会删除emp所有的statistics。

    analyze table emp delete statistics

    删除只是某些列变为空,如emp表的行数为空了

    SCOTT@PDBORCL> analyze table emp compute statistics;
    
    表已分析。
    
    SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
    
    TABLE_NAME    NUM_ROWS
    --------    ----------
    EMP         14
    
    SCOTT@PDBORCL> analyze table emp delete statistics;
    
    表已分析。
    
    SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
    
    TABLE_NAME   NUM_ROWS
    -------- ----------
    EMP
    
    SCOTT@PDBORCL>

    dbms_stats

    dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。

    语法:

    dbms_stats.gather_table_stats (
        ownname varchar2,
        tabname varchar2,
        partname varchar2,
        estimate_percent number,
        block_sample boolean,
        method_opt varchar2,
        degree number,
        granularity varchar2,
        cascade boolean,
        stattab varchar2,
        statid varchar2,
        statown varchar2,
        no_invalidate boolean,
        force boolean
    );

    dbms_stats.delete_table_stats 用于删除统计信息。

    例子:

    ------删除统计信息SCOTT@PDBORCL> exec dbms_stats.delete_table_stats (ownname => 'scott',tabname => 'emp');
    
    PL/SQL 过程已成功完成。
    ----查询统计信息
    SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
    
    TABLE_NAME NUM_ROWS
    -------- ----------
    EMP
    
    ---获取统计信息SCOTT@PDBORCL> exec dbms_stats.gather_table_stats (ownname => 'scott',tabname => 'emp');
    
    PL/SQL 过程已成功完成。
    ---重新查新统计信息
    SCOTT@PDBORCL> select table_name,num_rows from user_tables where table_name = 'EMP';
    
    TABLE_NAME  NUM_ROWS
    -------- ----------
    EMP          14
    
    SCOTT@PDBORCL>

    参考:

    为准确生成执行计划更新统计信息-analyze

    http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm#TGSQL389

  • 相关阅读:
    Sqlserver中一直在用又经常被忽略的知识点一
    PowerDesigner从Sqlserver中反转为带注释的字典及快捷键操作
    10.5 搜索的优化版
    每篇半小时1天入门MongoDB——1. MongoDB介绍和安装
    ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询
    Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项
    Mysql性能优化三(分表、增量备份、还原)
    Mysql性能优化二
    Mysql性能优化一
    Redis主从复制
  • 原文地址:https://www.cnblogs.com/xqzt/p/4467702.html
Copyright © 2020-2023  润新知