[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

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计