博客
关于我
达梦数据库的统计信息介绍
阅读量: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/

    你可能感兴趣的文章
    nginx添加允许跨域header头
    查看>>
    nginx添加模块与https支持
    查看>>
    nginx状态监控
    查看>>
    Nginx用户认证
    查看>>
    Nginx的location匹配规则的关键问题详解
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的使用总结(三)
    查看>>
    Nginx的使用总结(二)
    查看>>
    Nginx的使用总结(四)
    查看>>
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    nginx的平滑升级方法:
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx的端口修改问题
    查看>>
    nginx看这一篇文章就够了
    查看>>
    Nginx知识详解(理论+实战更易懂)
    查看>>
    Nginx简单介绍
    查看>>
    Nginx系列6之-rewirte功能使用案例总结
    查看>>
    nginx线程模型理解
    查看>>
    nginx自动摘除和恢复后端服务,进行自动检测
    查看>>