博客
关于我
达梦数据库的统计信息介绍
阅读量:176 次
发布时间:2019-02-28

本文共 1823 字,大约阅读时间需要 6 分钟。

什么是统计信息?

统计信息是数据库管理系统(DBMS)中用于优化查询执行计划的重要数据。它主要描述表、索引等数据库对象的大小、规模、数据分布状况等信息。例如,表的行数、块数、平均每行大小、索引的叶子块数、索引字段的行数、不同值的大小等都属于统计信息。基于统计信息,Cost-Based Optimization(CBO)可以计算不同访问路径和join方式下各种执行计划的成本,并选择成本最小的方案来执行查询操作。

统计信息的基本内容

统计信息包含以下几个重要的宏观数据:

  • 表所占的数据页数目
  • 实际使用数据页数
  • B树的高度(对于聚集索引表)
  • 此外,如果收集了列级或索引的统计信息,还包括以下内容:

    • COLID列的ID
    • 数据类型(SQL_PL_TYPE)
    • 总记录数(N_TOTAL)
    • 采样记录数(N_SAMPLE)
    • 不同值数(N_DISTINCT)
    • 空值数(N_NULL)
    • 最小值(V_MIN)
    • 最大值(V_MAX)
    • B树的高度(BLEVEL)
    • 叶子段的页数目(N_LEAF_PAGES)
    • 叶子段实际使用的页数目(N_LEAF_USED_PAGES)
    • 聚集因子(CLUSTER_FACTOR)

    需要注意的是,无论是否收集统计信息,表的当前记录数是系统自动维护的,这与大多数其他DBMS系统有所不同。

    统计信息的收集

    在Oracle数据库中,DM7(Data Mining Option)提供了两种收集统计信息的方法:存储过程和DBMS_STATS包。

    存储过程方法

    • 对表上所有索引生成统计信息:SP_TAB_INDEX_STAT_INIT
    • 对库上所有模式下的所有用户表上的所有索引生成统计信息:SP_DB_STAT_INIT
    • 对指定的索引生成统计信息:SP_INDEX_STAT_INIT
    • 对指定的列生成统计信息(不支持大字段列):SP_COL_STAT_INIT

    推荐方法

    推荐使用DBMS_STATS包来收集统计信息。与存储过程相比,DBMS_STATS包具有以下优势:

    • 可以指定采样率,尤其在数据分布极不均匀时,可以提高统计信息的采样率,提供更精确的统计信息。
    • 包含多种有用存储过程,例如:
      • COLUMN_STATS_SHOW:获取指定列的统计信息。
      • INDEX_STATS_SHOW:获取指定索引的统计信息。
      • GATHER_TABLE_STATS:根据设定的参数收集表的统计信息。
      • GATHER_INDEX_STATS:根据设定的参数收集索引的统计信息。
      • GATHER_SCHEMA_STATS:收集模式下对象的统计信息。

    示例

    例如,可以对SYSDBA模式下对象的统计信息进行采样,采样率为50%,对该模式下所有列进行统计信息收集(大字段列除外),如图所示。

    统计信息的查看

    在Oracle数据库中,可以通过以下方式查看统计信息:

  • 使用DBMS_STATS包提供的存储过程。
  • 使用SQL语句结合DBMS_STATS函数获取统计信息。
  • 通过Oracle管理工具(如Oracle SQL Developer或Oracle Cloud Console)查看统计信息。
  • 例如,可以执行以下SQL语句查看表的统计信息:

    SELECT column_name, table_name, n_distinct, n_null, n_sample FROM DBA_STATISTICS WHERE column_name = 'AGE'AND table_name = 'TEST_TJ';

    统计信息对查询的影响

    统计信息对数据库的查询执行计划(Plan)有重要影响。例如,如果未收集统计信息,数据库将使用默认的选择率(如5%)进行估算,这可能导致CBO选择错误的执行计划。

    示例

    假设执行以下查询:

    explain select count(*) from TEST_TJ where age = 20;

    在没有统计信息的情况下,执行计划可能如下:

    #SLCT2: [11, 2500, 4]; TEST_TJ.AGE = 205

    这里的2500是根据默认选择率(2.5%)估算的。

    而如果收集了统计信息,执行计划将基于更精确的选择率进行优化:

    #SLCT2: [11, 5000, 4]; TEST_TJ.AGE = 205

    这里的5000是基于实际数据分布(100000 * 0.05)估算的。

    因此,收集统计信息对CBO选择正确执行计划至关重要。

    转载地址:http://lqxd.baihongyu.com/

    你可能感兴趣的文章
    UML— 活动图
    查看>>
    Oracle Statspack分析报告详解(一)
    查看>>
    oracle 使用leading, use_nl, rownum调优
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    Oracle 创建 DBLink 的方法
    查看>>
    oracle 创建字段自增长——两种实现方式汇总
    查看>>
    Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
    查看>>
    oracle 可传输的表空间:rman
    查看>>
    Oracle 启动监听命令
    查看>>
    oracle 学习
    查看>>
    ORACLE 客户端工具连接oracle 12504
    查看>>
    oracle 行转列
    查看>>
    Oracle 表
    查看>>
    Oracle 递归
    查看>>
    oracle 逻辑优化,提升高度,综合SQL上下文进行逻辑优化
    查看>>
    oracle 闪回关闭,关闭闪回即disable flashback的操作步骤
    查看>>
    oracle--用户,权限,角色的管理
    查看>>
    oracle00205报错,Oracle控制文件损坏报错场景
    查看>>
    Oracle10g EM乱码之快速解决
    查看>>
    Oracle10g下载地址--多平台下的32位和64位
    查看>>