[Oracle] 统计信息和dbms_stats包

2024-05-14 07:32
文章标签 oracle 统计 信息 stats dbms

本文主要是介绍[Oracle] 统计信息和dbms_stats包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、统计信息的作用


Oracle基于CBO的优化器在生成执行计划时,很大程度上依赖于统计信息,你可以把CBO理解为一个复杂的数学模型,而统计信息是它最主要的输入,执行计划是输出,如果输入都不准确,输出还可能准确吗?所有,统计信息是否及时有效对执行计划的好坏有着关键的影响。


2、dbms_stats包


Oracle里采用dbms_stats包分析统计信息(Analyze命令已过时,不建议使用),该包的使用方法,官方文档有详细说明(http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_stats.htm#i1036461),这里挑几个最常用的说说。


1)gather_table_stats

DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT NULL,
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT 'FOR ALL COLUMNS SIZE
1',
degree NUMBER DEFAULT NULL,
granularity VARCHAR2 DEFAULT 'DEFAULT',
cascade BOOLEAN DEFAULT FALSE,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT FALSE);

这个包最常用,它是对表收集统计信息,语法如上所示,它的关键参数如下:
  • method_opt (直方图histogram选项)

先说说什么是直方图,直方图是对列上的数据分布进行统计,让优化器知道数据在各个列上的分布情况,如果数据在某列上的分布很倾斜,则最好对该列收集直方图信息。

method_opt有如下选项:

  1. for all columns  -> 统计该表所有列的直方图
  2. for all indexed columns  -> 统计该表上定义索引列的直方图
  3. for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:
    • N:直方图桶数,取值范围[1,254],1相当于不收集直方图
    • REPEAT:只收集原本有直方图信息的列;
    • AUTO:由Oracle自行决定N的大小
    • SKEWONLY: 只收集非均匀分布列的直方图,系统自动决定桶数(bucket )
示例1: 在表t上收集统计信息,但不收集直方图:
exec dbms_stats.gather_table_stats(user,'t',method_opt=>'for all columns size 1');

示例2:以最大桶数收集直方图:
exec dbms_stats.gather_table_stats(user, 't', method_opt=>'for all columns size 254');
  • granularity (统计信息收集的粒度,针对分区表)
该参数主要针对分区表,分区表有以下三种类型的统计信息
  1. global -> 全局统计信息
  2. partition -> 分区统计信息
  3. sub-partition -> 子分区统计信息
  • cascade (是否同时收集索引的统计信息)
该值为true等同于在该表上所有的索引上执行gather_index_stats。

2)gather_index_stats

DBMS_STATS.GATHER_INDEX_STATS (ownname          VARCHAR2, indname          VARCHAR2, partname         VARCHAR2 DEFAULT NULL,estimate_percent NUMBER   DEFAULT to_estimate_percent_type (GET_PARAM('ESTIMATE_PERCENT')),stattab          VARCHAR2 DEFAULT NULL, statid           VARCHAR2 DEFAULT NULL,statown          VARCHAR2 DEFAULT NULL,degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')),granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type (GET_PARAM('NO_INVALIDATE')),force            BOOLEAN DEFAULT FALSE);

该函数用于收集索引的统计信息。


3) gather_schema_stats

DBMS_STATS.GATHER_SCHEMA_STATS ( ownname          VARCHAR2, estimate_percent NUMBER   DEFAULT to_estimate_percent_type (get_param('ESTIMATE_PERCENT')), block_sample     BOOLEAN  DEFAULT FALSE, method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),degree           NUMBER   DEFAULT to_degree_type(get_param('DEGREE')), granularity      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'), cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')), stattab          VARCHAR2 DEFAULT NULL, statid           VARCHAR2 DEFAULT NULL, options          VARCHAR2 DEFAULT 'GATHER', objlist          OUT      ObjectTab,statown          VARCHAR2 DEFAULT NULL, no_invalidate    BOOLEAN  DEFAULT to_no_invalidate_type (get_param('NO_INVALIDATE')),force             BOOLEAN DEFAULT FALSE,obj_filter_list  ObjectTab DEFAULT NULL);

该函数用于收集整个schema的统计信息,重点说说以下几个参数:

  • options
gather: 收集schema下所有对象
gather auto: 由oracle自动决定哪些对象需要收集
gather stale: 只收集修改量超过10%的对象
gather empty: 只收集当前还没有统计信息的对象

下面是一个例子:

exec dbms_stats.gather_schema_stats(ownname=>'EPAY_USER', option=>'gather auto')

3、统计信息相关视图


1)表级统计信息

select table_name,num_rows,blocks,empty_blocks,avg_space from user_tables where table_name = 'TEST';
2)列级统计信息

select table_name,column_name,num_distinct,density from user_tab_columns where table_name = 'TEST';

3)列的直方图信息

select table_name,column_name,endpoint_number,endpoint_value
from user_tab_histograms
where table_name = 'TEST'
and column_name = 'OBJECT_ID';

4)分区统计信息

select partition_name,num_rows,blocks,empty_blocks,avg_space
from user_tab_partitions
where table_name = 'TEST';

5)分区上列的统计信息

select column_name,num_distinct,density,num_nulls
from user_part_col_statistics
where table_name = 'TEST'
and partition_name = 'P1';

6)分区上列的直方图信息

select column_name,bucket_number,endpoint_value
from user_part_histograms
where table_name = 'TEST'
and partition_name = 'P1'
and column_name = 'OBJECT_ID';

这篇关于[Oracle] 统计信息和dbms_stats包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988132

相关文章

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服