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

    你可能感兴趣的文章
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    mysql replace用法
    查看>>
    Mysql Row_Format 参数讲解
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>
    MySQL Server 5.5安装记录
    查看>>
    mysql server has gone away
    查看>>
    mysql slave 停了_slave 停止。求解决方法
    查看>>
    MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
    查看>>