Oracle里的统计信息

目录

一、什么是统计信息

二、oracle收集和查看统计信息的方法

1、使用analyze命令收集统计信息

2、使用dbms_stats包收集统计信息

3、analyze和dbms_stats的区别

4、查看统计信息


一、什么是统计信息

oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息。

oracle数据库里的统计信息主要分为以下6种情况:

(1)表的统计信息。

(2)列的统计信息。

(3)索引的统计信息。

(4)系统统计信息。

(5)数据字典统计信息。

(6)内部对象统计信息。

二、oracle收集和查看统计信息的方法

oracle数据库收集统计信息一般有以下2种方法:

(1)analyze命令。

(2)dbms_stats包。

针对以上6种统计信息,其中“表的统计信息”,“索引统计信息”,“列统计信息”,“数据字典统计信息”使用analyze或dbms_stats包收集均可以,但是“系统统计信息”和“内部对象统计信息”必须要dbms_stats包来收集才可以。

1、使用analyze命令收集统计信息

从oralce7开始,analyze命令就用来收集表、索引和列的统计信息。从oracle10g开始,创建索引后oracle会自动为您收集目标索引统计信息。analyze命令收集统计信息不会抹掉之间analyze结果。

创建测试表:

SQL>create table t1 as select * from dba_objects;

SQL>create index idx_t1 on t1(object_id);

(1)analyze索引统计信息:

SQL>analyze index idx_t1 delete statistics;

(2)对表收集统计信息,并且以估算模式,采样比为15%:

SQL>analyze table t1 estimate statistics sample 15 percent for table;

(3)对表收集统计信息,以统计模式:

SQL>analyze table t1 compute statistics for table;

(4)对列收集统计信息,以计算模式:

SQL>analyze table t1 compute statistics for columns object_name,object_id;

(5)以计算模式对表和列同时收集统计信息:

SQL>analyze table t1 compute statistics for t1 for columns object_name,object_id;

(6)以计算模式对索引收集统计信息:

SQL>analyze index idx_t1 compute statistics;

(7)删除表、表上的索引、表的所有列的统计信息:

SQL>analyze table t1 delete statistics;

(8)以计算模式,同时收集表、表上的列、表上的索引的统计信息:

SQL>analyze table t1 compute statistics;

2、使用dbms_stats包收集统计信息

从oracle 8.1.5开始,dbms_stats包就被广泛用于统计信息的收集,用dbms_stats包收集统计信息也是oracle官方推荐的方式。在收集CBO所需要的统计信息方面,可以简单的将dbms_stats包理解成是analyze命令的增强版。

DBMS_STATS包最常见的4个存储过程:

(1)dbms_stats.gather_table_stats:用于收集目标表,目标表上列及目标表上索引的统计信息。

(2)dbms_stats.gather_index_stats:用于收集指定索引的统计信息。

(3)dbms_stats.gather_schema_stats:用于收集schema下所有对象的统计信息。

(4)dbms_stats.gather_database_stats:用于收集全库统计对象的统计信息。

以下是dbms_stats包的具体用法:

(1)对表收集统计信息,并且以估算模式,采样比为15%:

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>15,method_opt=>'FOR TABLE',cascade=>FALSE);

注意:method_opt参数指定了FOR TABLE不是在所有版本oracle下都是好用的。

(2)对表收集统计信息,以计算模式:

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100,method_opt=>'FOR TABLE',cascade=>FALSE);

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>NULL,method_opt=>'FOR TABLE',cascade=>FALSE);

(3)对列收集统计信息,以计算模式:

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100,method_opt=>'FOR ALL CULUMNS SIZE 1 OBJECT_NAME OBJECT_ID',cascade=>FALSE);

注意:以上方法收集了列objec_name、object_id的统计信息,同时也会收集表的统计信息。

(4)以计算模式对索引收集统计信息:

SQL>exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'INDEX_T1',estimate_percent=>100);

(5)删除表、表上的索引、表的所有列的统计信息:

SQL>exec dbms_stats.delete_table_stats(ownname=>'SCOTT',tabname=>'T1');

(6)以计算模式,同时收集表、表上的列、表上的索引的统计信息:

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>15 ,cascade=>TRUE);

3、analyze和dbms_stats的区别

(1)analyze命令不能正确的收集分区表的统计信息,而dbms_stats包缺可以。

(2)analyze命令不能以并行收集统计信息,而dbms_stats包缺可以。

SQL>exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'T1',estimate_percent=>100, cascade=>FALSE,degree=>4);

(3)dbms_stats包只能收集与CBO相关的统计信息,而与CBO无关的额外信息,比如行迁移/行链接的数量(chain_cnt),校验表和索引的结构信息等,dbms_stats包就无能为力了,而analyze命令是可以用来分析和收集上述额外信息。比如:

SQL>analyze table XXX list chained rows into YYY; --用来分析和收集行迁移/行链接的数量。

SQL>analyze index XXX validate structure; --用来分析索引结构。

4、查看统计信息

oracle里的统计信息存储在数据字典表中,可以通过脚本来查询对象的统计信息。

sosi.sh脚本如下(可以查看表、索引、列的统计信息):

set echo off
set scan on
set lines 150
set pages 66
set verify off
set feedback off
set termout off
column uservar new_value Table_Owner noprint
select user uservar from dual;
set termout on
column TABLE_NAME heading "Tables owned by &Table_Owner" format a30
select table_name from dba_tables where owner=upper('&Table_Owner') order by 1
/
undefine table_name
undefine owner
prompt
accept owner prompt 'Please enter Name of Table Owner (Null = &Table_Owner): '
accept table_name  prompt 'Please enter Table Name to show Statistics for: '
column TABLE_NAME heading "Table|Name" format a15
column PARTITION_NAME heading "Partition|Name" format a15
column SUBPARTITION_NAME heading "SubPartition|Name" format a15
column NUM_ROWS heading "Number|of Rows" format 9,999,999,990
column BLOCKS heading "Blocks" format 999,990
column EMPTY_BLOCKS heading "Empty|Blocks" format 999,999,990
​
column AVG_SPACE heading "Average|Space" format 9,990
column CHAIN_CNT heading "Chain|Count" format 999,990
column AVG_ROW_LEN heading "Average|Row Len" format 990
column COLUMN_NAME  heading "Column|Name" format a25
column NULLABLE heading Null|able format a4
column NUM_DISTINCT heading "Distinct|Values" format 999,999,990
column NUM_NULLS heading "Number|Nulls" format 9,999,990
column NUM_BUCKETS heading "Number|Buckets" format 990
column DENSITY heading "Density" format 990
column INDEX_NAME heading "Index|Name" format a15
column UNIQUENESS heading "Unique" format a9
column BLEV heading "B|Tree|Level" format 90
column LEAF_BLOCKS heading "Leaf|Blks" format 990
column DISTINCT_KEYS heading "Distinct|Keys" format 9,999,999,990
column AVG_LEAF_BLOCKS_PER_KEY heading "Average|Leaf Blocks|Per Key" format 99,990
column AVG_DATA_BLOCKS_PER_KEY heading "Average|Data Blocks|Per Key" format 99,990
column CLUSTERING_FACTOR heading "Cluster|Factor" format 999,999,990
column COLUMN_POSITION heading "Col|Pos" format 990
column col heading "Column|Details" format a24
column COLUMN_LENGTH heading "Col|Len" format 9,990
column GLOBAL_STATS heading "Global|Stats" format a6
column USER_STATS heading "User|Stats" format a6
column SAMPLE_SIZE heading "Sample|Size" format 9,999,999,990
column to_char(t.last_analyzed,'MM-DD-YYYY') heading "Date|MM-DD-YYYY" format a10
​
prompt
prompt ***********
prompt Table Level
prompt ***********
prompt
select TABLE_NAME,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT,AVG_ROW_LEN,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_tables t
where owner = upper(nvl('&&Owner',user))
and table_name = upper('&&Table_name')
/
selectCOLUMN_NAME,decode(t.DATA_TYPE,'NUMBER',t.DATA_TYPE||'('||decode(t.DATA_PRECISION,null,t.DATA_LENGTH||')',t.DATA_PRECISION||','||t.DATA_SCALE||')'),'DATE',t.DATA_TYPE,'LONG',t.DATA_TYPE,'LONG RAW',t.DATA_TYPE,'ROWID',t.DATA_TYPE,'MLSLABEL',t.DATA_TYPE,t.DATA_TYPE||'('||t.DATA_LENGTH||')') ||' '||decode(t.nullable,'N','NOT NULL','n','NOT NULL',NULL) col,NUM_DISTINCT,DENSITY,NUM_BUCKETS,NUM_NULLS,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_tab_columns t
where table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user))
/
​
select INDEX_NAME,UNIQUENESS,BLEVEL BLev,LEAF_BLOCKS,DISTINCT_KEYS,NUM_ROWS,AVG_LEAF_BLOCKS_PER_KEY,AVG_DATA_BLOCKS_PER_KEY,CLUSTERING_FACTOR,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_indexes t
where table_name = upper('&Table_name')
and table_owner = upper(nvl('&Owner',user))
/
break on index_name
selecti.INDEX_NAME,i.COLUMN_NAME,i.COLUMN_POSITION,decode(t.DATA_TYPE,'NUMBER',t.DATA_TYPE||'('||decode(t.DATA_PRECISION,null,t.DATA_LENGTH||')',t.DATA_PRECISION||','||t.DATA_SCALE||')'),'DATE',t.DATA_TYPE,'LONG',t.DATA_TYPE,'LONG RAW',t.DATA_TYPE,'ROWID',t.DATA_TYPE,'MLSLABEL',t.DATA_TYPE,t.DATA_TYPE||'('||t.DATA_LENGTH||')') ||' '||decode(t.nullable,'N','NOT NULL','n','NOT NULL',NULL) col
from dba_ind_columns i,dba_tab_columns t
where i.table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user))
and i.table_name = t.table_name
and i.column_name = t.column_name
order by index_name,column_position
/
​
prompt
prompt ***************
prompt Partition Level
prompt ***************
​
selectPARTITION_NAME,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT,AVG_ROW_LEN,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_tab_partitions t
where table_owner = upper(nvl('&&Owner',user))
and table_name = upper('&&Table_name')
order by partition_position
/
​
​
break on partition_name
selectPARTITION_NAME,COLUMN_NAME,NUM_DISTINCT,DENSITY,NUM_BUCKETS,NUM_NULLS,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_PART_COL_STATISTICS t
where table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user))
/
​
break on partition_name
select t.INDEX_NAME,t.PARTITION_NAME,t.BLEVEL BLev,t.LEAF_BLOCKS,t.DISTINCT_KEYS,t.NUM_ROWS,t.AVG_LEAF_BLOCKS_PER_KEY,t.AVG_DATA_BLOCKS_PER_KEY,t.CLUSTERING_FACTOR,t.GLOBAL_STATS,t.USER_STATS,t.SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_ind_partitions t, dba_indexes i
where i.table_name = upper('&Table_name')
and i.table_owner = upper(nvl('&Owner',user))
and i.owner = t.index_owner
and i.index_name=t.index_name
/
​
​
prompt
prompt ***************
prompt SubPartition Level
prompt ***************
​
select PARTITION_NAME,SUBPARTITION_NAME,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT,AVG_ROW_LEN,GLOBAL_STATS,USER_STATS,SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_tab_subpartitions t
where table_owner = upper(nvl('&&Owner',user))
and table_name = upper('&&Table_name')
order by SUBPARTITION_POSITION
/
break on partition_name
select p.PARTITION_NAME,t.SUBPARTITION_NAME,t.COLUMN_NAME,t.NUM_DISTINCT,t.DENSITY,t.NUM_BUCKETS,t.NUM_NULLS,t.GLOBAL_STATS,t.USER_STATS,t.SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_SUBPART_COL_STATISTICS t, dba_tab_subpartitions p
where t.table_name = upper('&Table_name')
and t.owner = upper(nvl('&Owner',user))
and t.subpartition_name = p.subpartition_name
and t.owner = p.table_owner
and t.table_name=p.table_name
/
​
break on partition_name
select t.INDEX_NAME,t.PARTITION_NAME,t.SUBPARTITION_NAME,t.BLEVEL BLev,t.LEAF_BLOCKS,t.DISTINCT_KEYS,t.NUM_ROWS,t.AVG_LEAF_BLOCKS_PER_KEY,t.AVG_DATA_BLOCKS_PER_KEY,t.CLUSTERING_FACTOR,t.GLOBAL_STATS,t.USER_STATS,t.SAMPLE_SIZE,to_char(t.last_analyzed,'MM-DD-YYYY')
from dba_ind_subpartitions t, dba_indexes i
where i.table_name = upper('&Table_name')
and i.table_owner = upper(nvl('&Owner',user))
and i.owner = t.index_owner
and i.index_name=t.index_name
/
​
clear breaks
set echo on

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Linux中的history命令

前言:本文内容为实操学习记录,不具有调研价值,仅供参考! 正文: 接触过Linux操作系统的朋友一般都知道history命令,直接输入history命令,会显示当前用户的历史输入记录。这个原理是linux会记录我…

constexpr与std::is_same_v碰撞会产生什么火花?

1. 只编译会用到的if分支 示例代码一中,checkType_v1和checkType_v2两个函数的区别就是if的条件里一个加了constexpr一个没加,加与不加从结果来看都一样,那在编译时和运行时各有什么区别呢? 示例代码一,test_01.cpp&…

ctfshow靶场sql注入wp

目录 web171 web172 web173 web174 web175 web176 web177-179 web180-183 web184 web185 web187 web190 web191 web192 web193 web194 web195 web196 web197 web199 web201 web202 web203 web204 web205 web206 web207 web208 web209 web210 web…

【在javascript中更改日期的格式】

在JavaScript中,可以使用Date对象和一些内置方法来更改日期的格式。以下是一种常见的方法: 创建一个Date对象,可以使用以下方式之一: 使用无参数的构造函数创建当前日期和时间的Date对象:var date new Date();使用指…

RedissonLock-tryLock-续期

redisson版本3.16.6 1.什么是看门狗 Redisson提供的分布式锁是支持锁自动续期的,也就是说,如果线程仍旧没有执行完,那么redisson会自动给redis中的目标key延长超时时间,这在Redisson中称之为 Watch Dog 机制。默认情况下&#x…

vscode调试Unity

文章目录 vscode调试UnityC#环境需求开始调试 Lua添加Debugger环境配置联系.txt文件配置Java环境 添加调试代码断点不生效的问题 vscode调试Unity C# 现在使用vscode调试Unity的C#代码很简单,直接在vscode的EXTENSIONS里面搜索“Unity”,第一个就是&am…

VMware虚拟机更换引导顺序

前言 我用wmware装了黑群晖测试,将img转成vmdisk的格式之后发现系统引导盘之后1G,有点太小了 我准备把wmware的黑群晖系统迁移到新添加的虚拟磁盘里 1.登录黑群晖的SSH 请先在黑群晖的控制面板中的终端机和SNMP里面启用SSH功能,才能使用ss…

PLC_博图系列☞P=:在信号上升沿置位操作数

PLC_博图系列☞P:在信号上升沿置位操作数 文章目录 PLC_博图系列☞P:在信号上升沿置位操作数背景介绍P:在信号上升沿置位操作数说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 P 背景介绍 这是一篇关于PLC编程的文章…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式,有问题全选重试和是,打到这了,我感觉这个配置我都不用写了,启动靶机如下图所示即可 二.开始渗透 1.信…

蓝桥杯飞机降落dfs深度解析

蓝桥杯飞机降落dfs深度解析 蓝桥杯14届省赛[飞机降落]题目描述输入格式输出格式样例输入样例输出提示code完整代码: 蓝桥杯14届省赛[飞机降落] 题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的…

Few-short Learning笔记-1

Few short learning 用很少的样本进行分类或者是回归 support set:小的数据集(无法训练出深度神经网络) few short learning的目标是让机器自己学会学习。 few shot learning是一种meta learning(learn to learn) 举…

Rust编程(五)终章:查漏补缺

闭包 & 迭代器 闭包(Closure)通常是指词法闭包,是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量,在函数式编程范式中也被称为自由变量,是指并不是在闭包内定义的变量。将自…

MySQL学习笔记------DCL

DCL Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限 一、管理用户 1、查询用户 USE mysql; select *from user; 2、创建用户 create user 用户名主机名 identified by 密码&a…

向机器人传授人类社会同步的艺术

在数字时代,社交机器人正迅速成为主流社会的一部分,从培训医生和教育儿童到提供谈话疗法和客户服务。现在,这是一个价值数十亿美元的全球产业,对具有类似人类社交智能的机器人的需求不断增长,这标志着我们技术史上的一…

Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.冯诺依曼体系 二.操作系统 2.1概念 2.2结构示意图&…

质检规则-正则

目录 需求 实现 mysql oracle pg hive 达梦 需求 在数据质量检核中,经常会要求检查数据数据符合某些要求,比较某个字段是否是数字或者是否是日期等等,经常这种就用到数据库正则 实现 参数说明: 通用规则,${PAR…

主流公链 - BCH BSV BTG

为什么出现分叉 BTC是自由的,BTC社区也是自由的,自然而然的会出现不同观点的群体 1. 比特币现金(Bitcoin Cash,BCH) 分叉日期: 2017年8月1日主要目的: 提高比特币的交易吞吐量和降低交易费用技术…

写作类AI推荐(一)

本章要介绍的写作AI如下: paperpal 特点: 面向科研人员的AI写作工具。可以选择自己的专业,如本科生/教授。 链接:Paperpal-专业AI论文润色与论文检测平台 笔灵 特点: 面向专业写作领域的AI写作工具。可以选择要写的文章…

人事管理系统|基于springboot人事管理系统的设计与实现(附项目源码+论文)

基于springboot人事管理系统的设计与实现 目录 基于springboot人事管理系统的设计与实现 一、摘要 二、相关技术 三、系统设计 3.1 整体功能结构图 3.2 功能具体细节设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取: 一、摘要 传统信息…

C# 异步与 Unity 协程(实例讲解)

C#异步编程实例&#xff1a; 假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞 1using System.Net.Http; 2using System.Threading.Tasks; 3 4public class AsyncExample 5{ 6 public async Task<string> Fetch…