本文共 1824 字,大约阅读时间需要 6 分钟。
统计信息是数据库管理系统(DBMS)中用于优化查询执行计划的重要数据。它主要描述表、索引等数据库对象的大小、规模、数据分布状况等信息。例如,表的行数、块数、平均每行大小、索引的叶子块数、索引字段的行数、不同值的大小等都属于统计信息。基于统计信息,Cost-Based Optimization(CBO)可以计算不同访问路径和join方式下各种执行计划的成本,并选择成本最小的方案来执行查询操作。
统计信息包含以下几个重要的宏观数据:
此外,如果收集了列级或索引的统计信息,还包括以下内容:
需要注意的是,无论是否收集统计信息,表的当前记录数是系统自动维护的,这与大多数其他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
包提供的存储过程。DBMS_STATS
函数获取统计信息。例如,可以执行以下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/