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

    你可能感兴趣的文章
    Pytest自动化测试-简易入门教程(03)
    查看>>
    Pytest自动化测试指定执行测试用例
    查看>>
    Pytest自动化测试框架 fixture 传参实战
    查看>>
    pytest自动化测试框架pytest.ini配置文件详细
    查看>>
    Pytest自动化测试框架介绍
    查看>>
    Pytest自动化测试框架,建议收藏。
    查看>>
    Pytest自动化测试框架:mark用法---测试用例分组执行
    查看>>
    PyTorch 1.0 中文官方教程:强化学习 (DQN) 教程
    查看>>
    pytest:4种方法实现 - 重复执行用例 - 展示迭代次数
    查看>>
    Pytest:一个卓有成效的测试工具
    查看>>
    python
    查看>>
    Python "HTTP Error 403: Forbidden"
    查看>>
    python %ns的作用
    查看>>
    Python + Appium 之 APP 自动化测试,坑点汇总!(建议收藏)
    查看>>
    Python + Appium 自动化操作微信入门(超详细)
    查看>>
    Python + Pytest 自动化框架的用例依赖实操
    查看>>
    python进阶(8):yield函数
    查看>>
    Python + requests实现接口自动化测试!
    查看>>
    python + requests实现的接口自动化测试(超详细~)
    查看>>
    Python + selenium 如何截图?
    查看>>