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

    你可能感兴趣的文章
    RabbitMQ - 死信、TTL原理、延迟队列安装和配置
    查看>>
    PHP数据访问的多重查询(租房子查询)
    查看>>
    RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
    查看>>
    RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
    查看>>
    php数组函数分析--array_column
    查看>>
    php数组去重复数据的小例子
    查看>>
    php数组实现:哈希 +双向链表
    查看>>
    PHP数组排序函数array_multisort()函数详解(二)
    查看>>
    php数组的几个函数和超全局变量
    查看>>
    PHP文件上传详解
    查看>>
    PHP文件锁
    查看>>
    php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
    查看>>
    PHP时间戳和日期相互转换操作总结
    查看>>
    php时间戳知识点,php 时间戳函数总结与示例
    查看>>
    php更新数据库失败,php – 无法更新MySQL数据库
    查看>>
    php机器人聊天对话框,基于AIML的PHP聊天机器人
    查看>>
    PHP查找数组中最大值与最小值
    查看>>
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>
    php根据年月日计算年龄
    查看>>