首页 > 数据库 >Oracle Analyze 表分析的作用及基本用法

Oracle Analyze 表分析的作用及基本用法

时间:2023-06-21 16:00:28浏览次数:51  
标签:DBMS stats name 信息 用法 Oracle table Analyze 统计

Oracle Analyze 表分析的作用及基本用法

目录

01 概述

1、要使CBO发挥最大的作用,就必须对对象进行分析。Oracle根据分析的结果取cost最小的方案执行SQL。
2、数据库的分析可以通过analyze对表执行,也可以通过DBMS_DDL、DBMS_UTILITY、DBMS_STATS等包批量分析某个用户或者整个数据库。

ORACLE数据库的PL/SQL语句执行的优化器,有基于代价的优化器(CBO)和基于规则的优化器(RBO)。

RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索引的内容是否发生变化,不会影响PL/SQL语句的"执行计划"。

CBO自ORACLE7版被引入,ORACLE自7版以来采用的许多新技术都是只基于CBO的,如星型连接排列查询,哈希连接查询,反向索引,索引表,分区表和并行查询等。CBO计算各种可能"执行计划"的"代价",即cost,从中选用cost最低的方案,作为实际运行方案。各"执行计划"的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布是不清楚的,须要分析表和相关的索引,才能搜集到CBO所需的数据。

CBO是ORACLE推荐使用的优化方式,要想使用好CBO,使SQL语句发挥最大效能,必须保证统计数据的及时性。

统计信息的生成可以有完全计算法和抽样估算法。SQL例句如下:

完全计算法: analyze table abc compute statistics;
抽样估算法(抽样20%): analyze table abc estimate statistics sample 20 percent;

对表作完全计算所花的时间相当于做全表扫描,抽样估算法由于采用抽样,比完全计算法的生成统计速度要快,如果不是要求要有精确数据的话,尽量采用抽样分析法。建议对表分析采用抽样估算,对索引分析可以采用完全计算。

我们可以采用以下两种方法,对数据库的表和索引及簇表定期分析生成统计信息,保证应用的正常性能。

作用:

(1)搜集和删除索引、表和簇的统计信息
(2)验证表、索引和簇的结构
(3)鉴定表和簇和行迁移和行联接

针对analyze的搜集和删除统计信息功能而言,oracle推荐使用DBMS_STATS包来搜集优化信息,DBMS_STATS可以并行的搜集信息,可以搜集分区表的全局信息,进一步来说,按成本的优化器只会使用DBMS_STATS包所统计出来的信息。

02 Analyze使用场景

1.对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划。
,即使是一张很小的空表,如果进行了字段的增删改,也需要进行analyze,否则,执行计划也会出错。

2.所以即使是一张空表,如果对字段进行了增删改,即使merge字段很少时,也需要对表进行analyze。也就是说当前表的查询或其他性能不好时,都可以对相应的表进行一次分析。

1. 要想CBO发挥最大的作用,就必须对对象进行分析。Oracle根据结果取cost最小的方案执行SQL。
2. 数据库的分析可以通过analyze对表执行,也可以通过DBMS_DDL、DBMS_UTILITY、DBMS_STATS等包批量分析某个用户或者整个数据库。
3. 命令truncate不会修改数据的统计信息.
4. 可以对数据库的所有表每日特定时间进行分析,特殊情况下才手动analyze。

理论上只要表的数据量变化10%,数据库晚上会自动收集的,你自己手工收集肯定也没问题。查看后一次收集时间,SELECT last_analyzed FROM user_tables

权限:必须在你自己的方案中或有ANALYZE ANY system 的权限,

03 执行分析语法介绍

语法

ANALYZE

{ TABLE [ schema.]table
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| INDEX [ schema. ]index
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| CLUSTER [ schema. ]cluster
}
{ COMPUTE [ SYSTEM ] STATISTICS [for_clause]
| ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]
| validation_clauses
| LIST CHAINED ROWS [ into_clause ]
| DELETE [ SYSTEM ] STATISTICS
} ;

(1)INDEX index:对索引进行分析,分析的结果会放在USER_INDEXES, ALL_INDEXES,或 DBA_INDEXES中
分析的内容:
Depth of the index from its root block to its leaf blocks (BLEVEL)
Number of leaf blocks (LEAF_BLOCKS)
Number of distinct index values (DISTINCT_KEYS)
Average number of leaf blocks for each index value (AVG_LEAF_BLOCKS_PER_KEY)
Average number of data blocks for each index value (for an index on a table) (AVG_DATA_BLOCKS_PER_KEY)
Clustering factor (how well ordered the rows are about the indexed values) (CLUSTERING_FACTOR)

翻译:
索引从其根块到其叶块的深度(BLEVEL)
叶块数(LEAF_BLOCKS)
不同索引值的数目(DISTINCT_KEYS)
每个索引值的平均叶子块数(AVG_LEAF_BLOCKS_PER_KEY)
每个索引值(表上的索引)的平均数据块数(AVG_DATA_BLOCKS_PER_KEY)
聚类因子(行与索引值的排序程度)(CLUSTERING_FACTOR)

(2)TABLE table:对表进行分析,分析的结果会放在USER_TABLES, ALL_TABLES, and DBA_TABLES表中,在分析表的时候,oracle也会分析基于函数的index所引用的表达式
分析的内容:
Number of rows (NUM_ROWS) *
Number of data blocks below the high water mark (that is, the number of data blocks that have been formatted to receive data, regardless whether they currently contain data or are empty) (BLOCKS)
* Number of data blocks allocated to the table that have never been used (EMPTY_BLOCKS) Average available free space in each data block in bytes (AVG_SPACE)
Number of chained rows (CHAIN_COUNT) Average row length, including the row's overhead, in bytes (AVG_ROW_LEN) 

翻译:
行数(NUM_ROWS)*
低于高水位线的数据块的数量(即,已格式化以接收数据的数据块的数量,而不管它们当前是否包含数据或为空)(块)
*分配给表的从未使用过的数据块数(EMPTY_BLOCKS)每个数据块中的平均可用空间(以字节为单位)(AVG_SPACE)
链接的行数(CHAIN_COUNT)平均行长度,包括行的开销,以字节为单位(AVG_ROW_LEN)

(3)分析表的限制
不可以分析数据字典表
不可以分析扩展表,但可以用DBMS_STATS来实现这个目的
不可以分析临时表
不可以计算或估计下列字段类型
REFs, varrays, nested tables, LOBs (LOBs are not analyzed, they are skipped), LONGs, or object types.

(4)PARTITION | SUBPARTITION:对分区表或索引进行分析

(5)CLUSTER cluster:对簇进行分析,分析的结果会放在ALL_CLUSTERS, USER_CLUSTERS and DBA_CLUSTERS.  compute_statistics_clause

(6)语法:COMPUTE [ SYSTEM ] STATISTICS [for_clause]
对分析对像进行精确的统计,然后把信息存储的数据字典中。可以选择对表或对字段进行分析。
computed和estimated这两种方式的统计数据都被优化器用来影响sql的执行计划,如果指定system选项就只统计系统产生的信息

for_clause
FOR TABLE:只统计表
FOR COLUMNS:只统计某个字段
FOR ALL COLUMNS:统计所有字段
FOR ALL INDEXED COLUMNS:统计索引的所有字段
estimate_statistics_clause

(7)ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]
只是对部分行做一个大概的统计。适用于大表
SAMPLE:指定具体统计多少行,如果忽略这个参数的话,oracle会默认为1064行
ROWS causes:行数 Oracle to sample integer rows of the table or cluster or integer entries from the index. The integer must be at least 1.
PERCENT causes:百分数
validation_clauses

(8)分析REF或是对像的结构
EG:ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;
ANALYZE TABLE customers VALIDATE REF UPDATE;

04 常用的分析语句

--1 分析表的所有字段,所有索引,所有索引字段。其中:1=2(对表作完全计算所花的时间相当于做全表扫描)
analyze table table_name compute statistics;
Analyze index|cluster indexname estimate statistics;

--2 分析表的所有字段,所有索引,所有索引字段。其中:1 = 2
analyze table table_name compute statistics for table for all indexes for all columns;

--3 只分析所有有索引的字段
analyze table table_name compute statistics for table for all indexes for all indexed columns;

--4 抽样估算法(适合大表)
只分析20%的:
analyze table table_name estimate statistics sample 20 percent;
只分析10000行数据:
analyze table table_name estimate statistics sample 10000 row;

--5 删除分析数据
analyze table table_name delete statistics;
analyze table table_name delete statistics for table for all indexes for all indexed columns;



分析前后可以对比查看表的统计信息:

select table_name,num_rows,blocks,empty_blocks from user_tables where table_name='table';

总结:

这是对命令与工具包的一些总结
1、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a) 可以并行进行,对多个用户,多个Table
b) 可以得到整个分区表的数据和单个分区的数据。
c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d) 可以倒出统计信息
e) 可以用户自动收集统计信息
2、DBMS_STATS的缺点
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True
3、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息


--我们可以据此得出结论,只有我们在analyze table命令中指定了for table或者不指定任何参数的时候,oracle数据库才会给我们统计基于表的统计信息
--在指定for all columns 和不指定任何参数的时候oracle会给所有字段做统计信息,在指定for indexed columns时,oracle只给[b]有索引的字段进行字段信息统计[/b],如果我们别有必要给所有字段统计信息时,这个属性就很有用了.
--再综合前面的我们就会发现,如果在运行analyze table是我们不指定参数,oracle将收集对于特定表的所有统计信息(表,索引,表字段的统计信息)
--补充,truncate命令不修改统计信息

05 长时间不做 表分析可能造成的影响:

  1. 无法导出数据的问题,系统运行缓慢,CPU消耗严重,导出数据库时可能造成严重阻塞,可以通过排查对应的导出语句,分析对应的表。
  2. 可能一个很简单的查询会执行很长的时间,原因可能是因为相关的表执行过大量的增删改操作,导致统计信息不正确,走了错误的索引。

06 加锁的问题

analyze table/index validate structure会加DML级S锁,因此可能会影响到正常的DML操作,如果该语句执行时间过长的话,后果会比较严重。

用gather_table_stats,不锁表。 但也比较消耗资源,不要在业务高峰期做。

如果表很大那采样分析或动态采样,或者不要分析了,直接hints或outline。

hints或者outline:

分析统计表是为了获取到精确的统计信息,要统计信息是为CBO做优化计划用。我们可以可以不通过统计信息改变执行计划(hint/outline)

07 ORACLE的自动统计信息收集任务

案列:

在监控oracle数据库IO的时候发现每天晚上10点钟的时候oracle数据库读写明显增加。

对这个问题,后来查了一下是因为oracle在运行一个信息自动收集任务。oracle 11g中统计信息自动收集任务的名称是auto optimizer stats collection。11g中自动任务默认的执行时间窗口([oracle时间窗口介绍](http://i.cnblogs.com/oracle中Window和Window Group))为:

  • 周一到周五是晚上10点开始到2点结束
  • 周末是早上六点,持续20个小时。
在Oracle的11g版本中提供了统计数据自动收集的功能。在部署安装11g Oracle软件过程中,其中有一个步骤便是提示是否启动这个功能(默认是启用这个功能)。

在oracle 10g之前并没有自动收集统计信息的机制,对统计信息的收集一般都是由DBA手工编写SHELL脚本来实现。这样就会出现根据表或者其他对象的变更,需要频繁的变更SHELL脚本来适应数据库对象的变更。另外,可能很多DBA没有意识到统计信息对优化器的重要性,导致很多的SQL无法得到正确的执行计划。
基于统计信息对CBO的重要性,所以oracle从10g版本开始引入了自动收集统计信息的功能。自动统计信息收集作业能够每天收集统计信息。默认情况下,该收集作业会自动判断如下方面的内容。

1、需要对哪些对象收集统计信息。
2、需要对哪些统计信息已经过期的对象重复收集统计信息。
3、以估算模式收集统计信息的采样比例(默认是以估算模式进行收集)
4、需要对哪些列收集直方图统计信息以及相应的Bucket 的数量。
5、是否启用并行收集以及相应的并行度。



在这里介绍一下怎么将该功能启用与禁用:

1、查看自动收集任务及状态
select client_name,status from Dba_Autotask_Client where client_name='auto optimizer stats collection';
col OPERATION_NAME for a45
SELECT OPERATION_NAME,STATUS FROM DBA_AUTOTASK_OPERATION WHERE CLIENT_NAME LIKE '%stats%';

或者:
select client_name,status from dba_autotask_client;
其中"auto optimizer stats collection"便是我们要寻找的自动收集统计信息的任务名称,它的状态目前是启用状态。

2、停止自动收集任务
BEGIN
      DBMS_AUTO_TASK_ADMIN.DISABLE(
                     client_name => 'auto optimizer stats collection',
                     operation => NULL, window_name => NULL);
  END;
 /
--再次查询状态
select client_name,status from Dba_Autotask_Client where client_name='auto optimizer stats collection';

但是此时再查询DBA_ATUOTASK_TASK视图时,显示该任务状态还是ENABLED
select client_name,status from dba_autotask_task where client_name='auto optimizer stats collection';

Oracle给出的解释是在现在的版本中(11.1 to 11.2)一个client对应一个task,但是在将来的版本中会出现多个client会对应一个task,所以一个client被disabled了,不会改变task的状态。[ID 858852.1]

3、启动自动收集任务
BEGIN
        DBMS_AUTO_TASK_ADMIN.ENABLE(
                       client_name => 'auto optimizer stats collection',
                       operation => NULL, window_name => NULL);
    END;
  /
--再次查询
select client_name,status from Dba_Autotask_Client where client_name='auto optimizer stats collection';


4、查看自动收集任务历史执行状态
set linesize 300
col JOBS_CREATED format a80
col JOBS_STARTED format a80
col WINDOW_START_TIME format a40
col CLIENT_NAME format a40
SELECT client_name, window_name, jobs_created, jobs_started, jobs_completed,window_start_time FROM dba_autotask_client_history WHERE client_name like '%stats%';


或者
set line 250 pages 999
col WINDOW_NAME for a25
col WINDOW_NEXT_TIME for a25
alter session set nls_timestamp_tz_format='yyyy-mm-dd hh24:mi:ss';

select * from dba_autotask_window_clients;
col WINDOW_START_TIME for a45
col WINDOW_END_TIME for a45
col CLIENT_NAME for a35
set line 250 pages 999
select a.WINDOW_START_TIME,
       a.WINDOW_END_TIME,
       a.client_name,
       a.WINDOW_NAME,
       a.JOBS_CREATED,
       a.JOBS_STARTED,
       a.JOBS_COMPLETED
  from dba_autotask_client_history a
 where a.client_name like '%stats%'
 order by a.WINDOW_START_TIME;


 col CLIENT_NAME for a33
col WINDOW_NAME for a15
col WINDOW_START_TIME for a35
col WINDOW_DURATION for a35
col JOB_NAME for a22
col JOB_STATUS for a12
col JOB_START_TIME for a40
col JOB_DURATION for a15
col JOB_ERROR for 999999
col JOB_INFO for a35
set line 270 pages 999
SELECT *
  FROM DBA_AUTOTASK_JOB_HISTORY A
 WHERE A.CLIENT_NAME = 'auto optimizer stats collection'
 ORDER BY JOB_START_TIME;

通过时间窗口名称可以看出是周几执行的,在时间窗口内创建了几次job,执行了几次job

image-20210427102911796

更据上图可知在周二执行了一次

08 修改自动统计信息收集job的执行时间

  1. 查看自动收集任务执行时间窗口
select WINDOW_NAME, WINDOW_NEXT_TIME , WINDOW_ACTIVE,OPTIMIZER_STATS from DBA_AUTOTASK_WINDOW_CLIENTS order by WINDOW_NEXT_TIME ;

image-20210427103402665

由上可知系统将自动收集统计信息的时

  1. 查询自动收集任务正在执行的JOB
select client_name, JOB_SCHEDULER_STATUS from DBA_AUTOTASK_CLIENT_JOB where client_name='auto optimizer stats collection';

这个查询没有结果也很正常,只有job正在运行时,该查询才有结果。

  1. 修改自动收集统计信息的而时间段
这个功能貌似带来了统计数据采集上的便捷,但是Oracle 11g自动收集统计信息的时间是22:00--2:00
这个时间段往往是业务的高峰期,给本已紧张的系统带来更大的负担。所以,应该把自动执行的时间改到空闲的时段。

1.获得当前自动收集统计信息的执行时间:
select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');


image-20210427104211361

其中:
      WINDOW_NAME:任务名
      REPEAT_INTERVAL:任务重复间隔时间
      DURATION:持续时间
索引上图表示周一到周五 (byday=MON-FRI),每天的22点开始执行,持续时间4小时(duration),周末是早上6点执行,持续时间20小时。

4. 修改流程:

修改步骤如下:

1.停止任务:
SQL> BEGIN
  2    DBMS_SCHEDULER.DISABLE(
  3    name => '"SYS"."FRIDAY_WINDOW"',
  4    force => TRUE);
  5  END;
  6  /

PL/SQL 过程已成功完成。
2.修改任务的持续时间,单位是分钟:
SQL> BEGIN
  2    DBMS_SCHEDULER.SET_ATTRIBUTE(
  3    name => '"SYS"."FRIDAY_WINDOW"',
  4    attribute => 'DURATION',
  5    value => numtodsinterval(180,'minute'));
  6  END;  
  7  /

PL/SQL 过程已成功完成。
3.开始执行时间,BYHOUR=2,表示2点开始执行:
SQL> BEGIN
  2    DBMS_SCHEDULER.SET_ATTRIBUTE(
  3    name => '"SYS"."FRIDAY_WINDOW"',
  4    attribute => 'REPEAT_INTERVAL',
  5    value => 'FREQ=WEEKLY;BYDAY=MON;BYHOUR=2;BYMINUTE=0;BYSECOND=0');
  6  END;
  7  /

PL/SQL 过程已成功完成。
4.开启任务:
SQL> BEGIN
  2    DBMS_SCHEDULER.ENABLE(
  3    name => '"SYS"."FRIDAY_WINDOW"');
  4  END;
  5  /

PL/SQL 过程已成功完成。
5.查看修改后的情况:
SQL> select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2
  2  where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');

使用DBMS_STATS表收集统计信息:

DBMS_STATS.GATHER_TABLE_STATS的语法如下:
DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2,
estimate_percent NUMBER,
block_sample BOOLEAN,
method_opt VARCHAR2,
degree NUMBER,
granularity VARCHAR2,
cascade BOOLEAN,
stattab VARCHAR2,
statid VARCHAR2,
statown VARCHAR2,
no_invalidate BOOLEAN,
force BOOLEAN);

参数说明:

ownname:要分析表的拥者

tabname:要分析的表名.

partname:分区的名字,只对分区表或分区索引用.

estimate_percent:采样行的百分比,取值范围[0.000001,100],null为全部分析,不采样. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.

block_sapmple:是否用块采样代替行采样.

method_opt:决定histograms信息是怎样被统计的.method_opt的取值如下(默认值为FOR ALL COLUMNS SIZE AUTO):

for all columns:统计所列的histograms.

for all indexed columns:统计所indexed列的histograms.

for all hidden columns:统计你看不到列的histograms

for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:统计指定列的histograms.N的取值范围[1,254]; REPEAT上次统计过的histograms;AUTO由oracle决定N的大小;SKEWONLY multiple end-points with the same value which is what we define by "there is skew in thedata

degree:决定并行度.默认值为null.

granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned.

cascade:是收集索引的信息.默认为FALSE.

stattab:指定要存储统计信息的表,statid如果多个表的统计信息存储在同一个stattab中用于进行区分.statown存储统计信息表的拥者.以上个参数若不指定,统计信息会直接更新到数据字典.

no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.

force:即使表锁住了也收集统计信息.

按抽样百分比收集统计信息

exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT',tabname=>'TESTA',ESTIMATE_PERCENT=>0.01,method_opt=>'for all columns size auto',cascade=>true,force=>true,degree=>8);

grant select on EBUSLOGADMIN.T_PE2_KAFKA_LOG to system;

revoke select on EBUSLOGADMIN.T_PE2_KAFKA_LOG from system;


select table_name,sample_size,num_rows,round(sample_size/num_rows*100,1) "%" from dba_tables where table_name='TESTA';

select table_name,num_rows,a.blocks,a.last_analyzed from all_tables a where a.table_name='EMP';
说明:
-- table_name:展示表名 
--num_rows:最后一次统计时的行数 
--blocks:非当前块数,最后一次统计时的块数 
--last_analyzed :最后一次统计的时间 
--上述字段为null说明未统计

收集数据库统计信息:

EXEC DBMS_STATS.gather_database_stats;
EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15);
select table_name,NUM_ROWS,BLOCKS,AVG_ROW_LEN,last_analyzed from dba_tables

收集schema信息

EXEC DBMS_STATS.gather_schema_stats('WEISI');
EXEC DBMS_STATS.gather_schema_stats('WEISI', estimate_percent => 15);
select table_name,NUM_ROWS,BLOCKS,AVG_ROW_LEN,last_analyzed from dba_tables t where t.owner='WEISI'

收集表信息

EXEC DBMS_STATS.gather_table_stats('WEISI', 'NORMAL_T');
EXEC DBMS_STATS.gather_table_stats('WEISI', 'NORMAL_T', estimate_percent => 15);
select table_name,NUM_ROWS,BLOCKS,AVG_ROW_LEN,last_analyzed from dba_tables t where t.owner='WEISI'

收集index信息

EXEC DBMS_STATS.gather_index_stats('WEISI', 'NORMAL_T_INDEX');
EXEC DBMS_STATS.gather_index_stats('WEISI', 'NORMAL_T_INDEX', estimate_percent => 15);
select LEAF_BLOCKS,BLEVEL,CLUSTERING_FACTOR from dba_indexes t where t.owner='WEISI'

删除收集信息

EXEC DBMS_STATS.delete_database_stats;
EXEC DBMS_STATS.delete_schema_stats('WEISI');
EXEC DBMS_STATS.delete_table_stats('WEISI', 'NORMAL_T');
EXEC DBMS_STATS.delete_index_stats('WEISI', 'NORMAL_T_INDEX');
select table_name,NUM_ROWS,BLOCKS,AVG_ROW_LEN,last_analyzed from dba_tables t where t.owner='WEISI'
select index_name,LEAF_BLOCKS,BLEVEL,CLUSTERING_FACTOR from dba_indexes t where t.owner='WEISI'

创建备份收集信息表

数据库的统计信息备份恢复(只能是sys用户下)

exec dbms_stats.create_stat_table('sys','stat_wzx');
exec dbms_stats.export_database_stats('stat_wzx');
exec dbms_stats.import_database_stats('stat_wzx');

方案的统计信息备份恢复(只能在方案拥有者的用户下,weisi为用户名)

exec dbms_stats.create_stat_table('weisi','stat_wzx');
exec dbms_stats.export_schema_stats('weisi','stat_wzx');
exec dbms_stats.import_schema_stats('weisi','yyy');

表的统计信息备份恢复(只能在表拥有者的用户下)

exec dbms_stats.create_stat_table('weisi','stat_wzx');
exec dbms_stats.export_table_stats('weisi','NORMAL_T',null,'stat_wzx');
exec dbms_stats.import_table_stats('weisi','NORMAL_T',null,'stat_wzx');

sqlplus weisi/wesi@weisi
create table stat_t as select * from normal_t;
select table_name,last_analyzed from user_tables where table_name='STAT_T';

exec dbms_stats.gather_table_stats('weisi','STAT_T');

select table_name,last_analyzed from user_tables where table_name='STAT_T';

exec dbms_stats.create_stat_table('weisi','stat_wzx');

select count(1) from stat_wzx;

exec dbms_stats.export_table_stats('weisi','STAT_T',null,'stat_wzx');

--exec dbms_stats.export_table_stats('weisi','NORMAL_T',null,'stat_wzx');

select count(1) from stat_wzx;

exec dbms_stats.delete_table_stats('weisi','STAT_T');

select table_name,last_analyzed from user_tables where table_name='STAT_T';

exec dbms_stats.import_table_stats('weisi','STAT_T',null,'stat_wzx');

select table_name,last_analyzed from user_tables where table_name='STAT_T';

统计信息查询

1:查询表最后一次统计时间

-- tables statistics

select owner,table_name,num_rows,last_analyzed from dba_tables where table_name in ('NORMAL_T') order by table_name;

2:查询分区表统计时间

-- partition tables staticstics

select TABLE_OWNER,table_name,partition_name,num_rows,last_analyzed from dba_tab_partitions where table_name in
 ('NORMAL_T')
order by TABLE_OWNER,table_name, partition_name;

3:查询索引统计时间

-- indexes staticstics

select OWNER,index_name,TABLE_NAME,NUM_ROWS,LAST_ANALYZED from dba_indexes
where table_name in
('NORMAL_T')
order by OWNER,table_name,index_name;

4:查询分区本地索引统计时间

-- local parition indexes staticstics

select dip.INDEX_OWNER,di.table_name,dip.INDEX_NAME,dip.PARTITION_NAME,dip.partition_name,dip.num_rows,dip.last_analyzed from dba_ind_partitions dip, dba_indexes di where di.table_name in
('NORMAL_T')
and dip.index_name=di.index_name
order by dip.INDEX_OWNER,di.table_name,dip.index_name,dip.partition_name;

5:查看自动收集统计信息的任务及状态

select CLIENT_NAME,STATUS from dba_autotask_client ;

标签:DBMS,stats,name,信息,用法,Oracle,table,Analyze,统计
From: https://www.cnblogs.com/xulinforDB/p/17496462.html

相关文章

  • Oracle19C如何为PDB新建service
     Oracle19C如何为PDB新建service 在11g版本中,通常可以通过4种方式来新增service:通过修改service_names参数来新增,这个是比较常用的通过srvctladdservice(只适用于RAC或OracleRestart)通过配置$ORACLE_HOME/network/admin/listener.ora静态监听通过dbms_service 关......
  • Oracle 建表空间、用户
    1.--创建表空间createtablespacehisdb2020 --表空间名称 datafile'D:\app\lt\product\11.2.0\hisdb2020.dbf' --地址 size22100m  --表空间大小 autoextendon next100m ---增长大小创建临时表空间createtablespacexin_datafiledatafile‘D:\a......
  • Oracle中group by
    Oracle中groupby在select语句中可以使用groupby子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总信息。使用having子句限制返回的结果集。groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby......
  • oracle和MySQL区别在大数据上体现
    原文,https://blog.csdn.net/weixin_39569543/article/details/111090287结论:阿里java开发手册禁止三张表join大数据量下使用join导致数据冗余更大,MySQL处理不了过大的数据量,Oracle可以正常处理......
  • 世界级Oracle专家权威力作
     世界级Oracle专家权威力作《Oracle10g数据库管理艺术》姊妹篇全面阐述Oracle11g新特性   “这是市面上最详细的11g参考书,内容非常丰富,我极力推荐此书。”——Amazon.com Oracle因为卓越的性能、可扩展性、可用性、安全性和易管理性,在数据库市场一直保持领先......
  • Odoo中的Create方法及其用法
    在Odoo开发中,使用Create方法可以方便地创建新的记录,并将其存储在数据库中。本文将介绍Create方法的基本语法和使用示例,并进一步探讨一些高级用法和技巧。Create方法的基本语法在Odoo中,Create方法是通过模型对象(Model)进行调用的。以下是Create方法的基本语法:model.create(valu......
  • Oracle系列---【REGEXP_LIKE函数的使用】
    REGEXP_LIKE函数的使用REGEXP_LIKE函数的使用场景oracle中有两张表,一张叫A_PACKAGE,另一张叫A_RULE,两张表通过PACKAGE_ID关联。其中,A_PACKAGE表中有一个字段channelId,存储的是'B,C,PUB'格式的(多个channelId用逗号隔开),现在已知channelId='B',如何根据'B'查找符合条件的A_RULE......
  • css滤镜基本用法
    CSSfilter属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染。它的值可以为filter函数<filter-function>或使用url添加的svg滤镜。filter:<filter-function>[<filter-function>]*|nonefilter:url(file.svg#filter-element-i......
  • Vue3中computed的用法
    Vue3中computed的用法computed又被称作计算属性,用于动态的根据某个值或某些值的变化,来产生对应的变化,computed具有缓存性,当无关值变化时,不会引起computed声明值的变化。产生一个新的变量并挂载到vue实例上去。一、computed简写形式<template><div><div>姓:<inputtype="te......
  • Oracle列转行函数LISTAGG() WITHIN GROUP ()用法
    1:SELECTID,SIDFROMTestWHERE ID='001' 2:SELECTID,LISTAGG(SID,',')WITHINGROUP(ORDERBYSID)ASSID_LISTFROMTestWHERE ID='001'groupbyID  ......