emp表有如下数据。SQL> select ename,deptno from emp; ENAME   DEPTNO ------------------------------ ---------- SMITH       20 ALLEN       30 WARD       30 JONES       20 MARTIN       30 BLAKE       30 CLARK       10 SCOTT       20 KING       10 TURNER       30 ADAMS       20 JAMES       30 FORD       20 MILLER       10 14 rows selected.

假设我们有如下简单的查询select ename,deptno from emp where ename='RICH' and deptno=10;

那么Oracle在执行查询的时候,是先比较ename字段呢?还是先比较deptno字段呢?

显然先比较deptno再比较ename字段的效率明显低于先比较ename,再比较deptno。 那Oracle究竟如何去判断呢?

我们先查询一张表SQL> COL COLUMN_NAME FOR A30 SQL> SELECT column_name, num_distinct, density   FROM dba_tab_columns  WHERE owner = 'SCOTT' AND table_name = 'EMP'; COLUMN_NAME       NUM_DISTINCT    DENSITY ------------------------------ ------------ ---------- EMPNO 14 .071428571 ENAME 14 .071428571 JOB  5    .2 MGR  6 .166666667 HIREDATE 13 .076923077 SAL 12 .083333333 COMM  4   .25 DEPTNO  3 .333333333 8 rows selected.

Oracle其实知道,你的表中存放数据的一些特征,上面语句显示的只是凤毛麟角。通过这些特征,Oracle优化器就能知道如何去查询,使得执行的效率最高。

以上这些信息,我们称之为对象的统计信息。那么如何收集统计信息呢?

一、 analyze 命令

使用analyze命令可以收集统计信息,如:收集或删除对象的统计信息

验证对象的结构

确定table 或cluster的migrated 和chained rows。

示例:SQL> create user anal identified by anal ; User created. SQL> grant resource,connect to anal; Grant succeeded. SQL> grant select any dictionary to anal; Grant succeeded. SQL> conn anal/anal Connected. SQL> create table t1 as select * from dba_objects; SQL> create table t2 as select * from dba_objects; SQL> create table t3 as select * from dba_objects; SQL> create table t4 as select * from  dba_objects; SQL> create table t5 as select * from dba_objects; SQL> create table t6 as select * from dba_objects; SQL>  create unique index pk_t1_idx on t1(object_id); SQL>  create unique index pk_t2_idx on t2(object_id); SQL>  create unique index pk_t3_idx on t3(object_id); SQL>  create unique index pk_t4_idx on t4(object_id); SQL>  create unique index pk_t5_idx on t5(object_id); SQL>  create unique index pk_t6_idx on t6(object_id);

我们先查看一下统计信息是否存在

查看表的统计信息SQL> select table_name, num_rows, blocks, empty_blocks       from user_tables      where table_name in ('T1', 'T2', 'T3', 'T4', 'T5','T6');

查看字段统计信息select table_name,        column_name,        num_distinct,        low_value,        high_value,        density   from user_tab_columns  where table_name in ('T1', 'T2', 'T3', 'T4','T5','T6');

查看索引统计信息SQL> col table_name for a30 SQL> col index_name for a30 SELECT table_name,        index_name,        blevel,        leaf_blocks,        distinct_keys,        avg_leaf_blocks_per_key avg_leaf_blocks,        avg_data_blocks_per_key avg_data_blocks,        clustering_factor,        num_rows   FROM user_indexes TABLE_NAME       INDEX_NAME  BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS AVG_DATA_BLOCKS CLUSTERING_FACTOR   NUM_ROWS ------------------------------ ------------------------------ ---------- ----------- ------------- --------------- --------------- ----------------- ---------- T6       PK_T6_IDX       1 155     74564 1 11174  74564 T5       PK_T5_IDX       1 155     74563 1 11174  74563 T4       PK_T4_IDX       1 155     74562 1 11174  74562 T3       PK_T3_IDX       1 155     74561 1 11174  74561 T2       PK_T2_IDX       1 155     74560 1 11174  74560 T1       PK_T1_IDX       1 155     74559 1 11174  74559 6 rows selected.

表没有任何统计数据,但是索引已经有统计信息,可见在建立表的时候会默认收集统计信息。

先将索引的统计信息删除SQL> analyze table t1 delete statistics; analyze table t2 delete statistics; analyze table t3 delete statistics; analyze table t4 delete statistics; analyze table t5 delete statistics; analyze table t6 delete statistics;

验证索引上是否还存在统计信息SELECT table_name,        index_name,        blevel,        leaf_blocks,        distinct_keys,        avg_leaf_blocks_per_key avg_leaf_blocks,        avg_data_blocks_per_key avg_data_blocks,        clustering_factor,        num_rows   FROM user_indexes

执行统计信息命令,并查看统计信息有无变化

analyze table t1 compute statistics for table;

–针对表收集信息,查看user_tables

analyze table t2 compute statistics for all columns;

–针对表字段收集信息,查看user_tab_columns

analyze table t3 compute statistics for all indexed columns;

–收集索引字段信息

analyze table t4 compute statistics;

–收集表,表字段,索引信息

analyze table t5 compute statistics for all indexes;

–收集索引信息

analyze table t6 compute statistics for table for all indexes for all columns;

–收集表,表字段,索引信息

二、DBMS_STATS包

Oracle推荐使用DBMS_STATS这个包来收集统计信息。这个包的功能非常多。可以收集数据库级别、schema级别及表级别的统计信息。还可以对统计信息删除、锁定、导出、导入等。我们以最常用的表级别统计为例说明DBMS_STATS该如何使用。

收集的统计信存储在dba_tab_statistics、dba_ind_statistics和dba_tab_col_statistics表中。DBMS_STATS.GATHER_TABLE_STATS (    ownname          VARCHAR2,     tabname          VARCHAR2,     partname         VARCHAR2 DEFAULT NULL,    estimate_percent NUMBER   DEFAULT to_estimate_percent_type                                                  (get_param('ESTIMATE_PERCENT')),     block_sample     BOOLEAN  DEFAULT FALSE,    method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),    degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),    granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),     cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),    stattab          VARCHAR2 DEFAULT NULL,     statid           VARCHAR2 DEFAULT NULL,    statown          VARCHAR2 DEFAULT NULL,    no_invalidate    BOOLEAN  DEFAULT  to_no_invalidate_type (                                      get_param('NO_INVALIDATE')),    stattype         VARCHAR2 DEFAULT 'DATA',    force            BOOLEAN  DEFAULT FALSE);

参数说明如下:

导出、导入统计信息要导出统计信息首先要建立一个统计表

语法:DBMS_STATS.CREATE_STAT_TABLE (    ownname  VARCHAR2,     stattab  VARCHAR2,    tblspace VARCHAR2 DEFAULT NULL);SQL> exec DBMS_STATS.CREATE_STAT_TABLE (user,'STAT_TMP','SYSAUX'); PL/SQL procedure successfully completed.

2. 将表t1统计信息导出DBMS_STATS.EXPORT_TABLE_STATS (    ownname         VARCHAR2,     tabname         VARCHAR2,     partname        VARCHAR2 DEFAULT NULL,    stattab         VARCHAR2,     statid          VARCHAR2 DEFAULT NULL,    cascade         BOOLEAN  DEFAULT TRUE,    statown         VARCHAR2 DEFAULT NULL,    stat_category   VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);SQL> EXEC DBMS_STATS.EXPORT_TABLE_STATS (ownname=>USER,tabname=>'T1',stattab=>'STAT_TMP'); PL/SQL procedure successfully completed.

3. 导入统计信息

语法:DBMS_STATS.IMPORT_TABLE_STATS (    ownname         VARCHAR2,     tabname         VARCHAR2,    partname        VARCHAR2 DEFAULT NULL,    stattab         VARCHAR2,     statid          VARCHAR2 DEFAULT NULL,    cascade         BOOLEAN  DEFAULT TRUE,    statown         VARCHAR2 DEFAULT NULL,    no_invalidate   BOOLEAN DEFAULT to_no_invalidate_type(                                     get_param('NO_INVALIDATE')),    force           BOOLEAN DEFAULT FALSE,    stat_category   VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);SQL> exec dbms_stats.UNlock_table_stats(user,'T1'); PL/SQL procedure successfully completed. SQL> exec dbms_stats.delete_table_stats(user,'T1'); PL/SQL procedure successfully completed. SQL> EXEC DBMS_STATS.IMPORT_TABLE_STATS (ownname=>USER,tabname=>'T1',stattab=>'STAT_TMP'); PL/SQL procedure successfully completed. SQL> SELECT table_name,        num_rows,        blocks,        empty_blocks,        avg_row_len   FROM user_tab_statistics;  2    3    4    5    6   TABLE_NAME NUM_ROWS     BLOCKS EMPTY_BLOCKS AVG_ROW_LEN ------------------------------ ---------- ---------- ------------ ----------- T1    7455910880   98 T2 T3 T4 T5 T6 STAT_TMP 7 rows selected.

如果是分区表,新的分区来不及收集统计系统,可以使用其它的分区统计信息来生成新分区的统计信息DBMS_STATS.COPY_TABLE_STATS (    ownname          VARCHAR2,     tabname          VARCHAR2,     srcpartname      VARCHAR2,    dstpartname      VARCHAR2,     scale_factor     VARCHAR2 DEFAULT 1,    force            BOOLEAN DEFAULT FALSE);

如果表还没有统计信息,那么在执行sql语句时,Oracle会动态的采样表中的一部分数据,生成统计信息。

本文转自51CTO博客,版权归原作者所有!如果侵犯到您的版权,请及时联系我们删除!SQL> show parameter optimizer_dynamic_sampling ; NAME     TYPE       VALUE ------------------------------------ --------------------------------- ------------------------------ optimizer_dynamic_sampling     integer       2

oracle tabe unlock_Oracle 学习之性能优化(四)收集统计信息相关推荐

  1. oracle并行收集统计信息慢,Oracle 学习之性能优化(四)收集统计信息

    emp表有如下数据.SQL> select ename,deptno from emp; ENAME   DEPTNO ------------------------------ ------ ...

  2. 如何学习Linux性能优化?

    如何学习Linux性能优化? 你是否也曾跟我一样,看了很多书.学了很多 Linux 性能工具,但在面对 Linux 性能问题时,还是束手无策?实际上,性能分析和优化始终是大多数软件工程师的一个痛点.但 ...

  3. oracle tabe unlock_Oracle数据库之统计信息锁住导致收集统计信息失败引起sql执行异常...

    本文主要向大家介绍了Oracle数据库之统计信息锁住导致收集统计信息失败引起sql执行异常,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 这个是老生产谈的事情,统计信息不准确导 ...

  4. oracle事务数统计,【学习笔记】Oracle数据库收集统计信息的两种方法介绍案例

    天萃荷净 分享一篇关于Oracle数据库收集统计信息的办法,Oracle DBMS_STATS与Oracle analyze使用方法案例 今天群里面讨论DBMS_STATS和analyze,这里进行了 ...

  5. 验证Oracle收集统计信息参数granularity数据分析的力度

    最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, ---所有者名字 tabname ...

  6. Oracle收集统计信息

    Oracle收集统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...

  7. Oracle收集统计信息之NO_INVALIDATE参数

    Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO ...

  8. oracle 查看统计情报,Oracle 查看收集统计信息

    -- Start 统计信息相当于情报,对 Oracle 至关重要,如果统计信息不准确,Oracle 就会做出错误的判断.那如何查看统计信息呢?试一试下面的 SQL 吧. -- 查看表统计信息 sele ...

  9. Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1)

    Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1) 编辑手记:从11.2开始,可以通过CONCURRENT参数,启用表或分区的并行扫描,加快统计信息的收集速度. ...

最新文章

  1. python实现全角和半角互相转换
  2. 细分tf.multiply()、tf.matmul()、tf.scalar_mul()函数
  3. ipad流水布局及其旋转界面view间隔布局调整
  4. .net随笔-vb.net打开外部程序发送键盘信号(3)
  5. xpath+多进程爬取网易云音乐热歌榜。
  6. 一个课程,11个项目!爬虫初体验,快来!
  7. mysql报错error2002_mysql中异常错误ERROR:2002的解决方法分享
  8. 一个C++工程CPU占用100%问题的排查
  9. 脉位调制解调 matlab,基于matlab的am调制解调
  10. 从「猜画小歌」,谈企业的「数据困惑」该何去何从?
  11. java代码示例(6-2)
  12. oracle for redhat 5.4 x64安装
  13. 《Linux私房菜》——一、linux基础整理
  14. 机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
  15. Selenium简单的163邮箱登录实例
  16. PID参数调节的经验
  17. APS Interview - Digital Circuit and Digital Logic I
  18. js库笔记(一):swr ahooks
  19. [react] Target container is not a DOM element
  20. js处理时间戳转成日期格式

热门文章

  1. VTK修炼之道4_Win32控制台项目
  2. javascript中的事件处理
  3. go语言buffio与继承
  4. 拦截器中addInterceptor和excludePathPatterns里的/* /**是什么
  5. Java中static关键字有什么用?
  6. Spring Aop 组件概述
  7. docker安装logstash及logstash配置
  8. The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online
  9. 如何通过Bit-Z的场外交易购买BZ?(新手图文攻略)
  10. layui select下拉框改变之 change 监听事件