ORACLE-统计信息收集&&分析表和索引

统计信息收集

作用: DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信息收集,包含该表的自身-表的行数、数据块数、行长等信息;列的分析--列值的重复数、列上的空值、数据在列上的分布情况;索引的分析-索引页块的数量、索引的深度、索引聚合因子)

DBMS_STATS.GATHER_TABLE_STATS的语法如下:

sql 复制代码
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 ALLCOLUMNS SIZE AUTO):

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

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

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

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

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

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

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

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

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

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

例子:

sql 复制代码
begin
dbms_stats.gather_table_stats(ownname => 'HXAPP',tabname => 'kcgb_sfdjbu',estimate_percent => 10,method_opt=> 'for all indexed columns',cascade=>TRUE);
end;

可以查看dbms_stats包里面的各个存储过程来使用

分析数据库(包括所有的用户对象和系统对象):dbms_stats.gather_database_stats()

分析用户所有的对象(包括表、索引、簇):dbms_stats.gather_schema_stats()

分析表:dbms_stats.gather_table_stats()

分析索引:dbms_stats.gather_index_stats()

删除数据库统计信息:dbms_stats.delete_database_stats()

删除用户方案统计信息:dbms_stats.delete_schema_stats()

删除表统计信息:dbms_stats.delete_table_stats()

删除索引统计信息:dbms_stats.delete_index_stats()

删除列统计信息:dbms_stats.delete_column_stats()

设置表统计信息:dbms_stats.set_table_stats()

设置索引统计信息:dbms_stats.set_index_stats()

设置列统计信息:dbms_stats.set_column_stats()

导出整个schema的统计信息:dbms_stats.export_schema_stats()

可以查看表 DBA_TABLES来查看表是否与被分析过,如:

SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES

分析表和索引

例子

在测试收取费用时,发现收费登记簿按照index_odb1索引查询和更新特别慢,并且对表进行统计信息收集后依然无法解决,在网上查到了analyze工具,在执行了

analyze table xxxx_sfdjbu compute statistics for table for all indexes for all indexed columns;

命令后,之前耗时40秒左右的慢SQL基本不会出现了。

  • 首先查询长期锁表SQL的sid
sql 复制代码
SELECT b.sid,
       b.serial#,
       b.logon_time,
       b.username,
       b.osuser,
       a.object_name,
       'alter system kill session ''' || b.sid || ',' || b.serial# || ''';' AS kill
  FROM (SELECT s.*, t.object_name
          FROM v$locked_object s, dba_objects t
         WHERE s.object_id = t.object_id) a
  LEFT OUTER JOIN v$session b
    ON a.session_id = b.sid
 ORDER BY b.logon_time, b.sid;
  • 然后根据sid查询SQL计划等信息
sql 复制代码
SELECT * FROM v$session t WHERE t.SID = '10407';
SELECT * FROM v$sql t WHERE t.SQL_ID = '9tpmx87nz4jzh';
SELECT * FROM v$sql_plan t WHERE t.SQL_ID = '9tpmx87nz4jzh';
SELECT * FROM  v$sqlarea t WHERE t.SQL_ID = '9tpmx87nz4jzh';

SELECT * FROM v$session t WHERE t.SID = '10407';
SELECT * FROM v$sql t WHERE t.SQL_ID = '56a5h016rxdx8';
SELECT * FROM v$sql_plan t WHERE t.SQL_ID = '56a5h016rxdx8';
SELECT * FROM  v$sqlarea t WHERE t.SQL_ID = '56a5h016rxdx8';

发现对应的SQL没有按照索引执行,执行对应表的分析表和索引命令进行优化。


以下为网上查询到的信息

  • 分析表
sql 复制代码
analyze table tablename compute statistics;
  • 分析索引
sql 复制代码
analyze index indexname compute statistics;

该语句生成的统计信息会更新user_tables这个视图的统计信息,分析的结果被Oracle用于基于成本的优化生成更好的查询计划

对于使用CBO(Cost-Base Optimization)很有好处,可以使用更可靠的table信息,从而执行计划也可以更准确一些,在10g会自动analyze,之前的版本需要手动定期

analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。

sql 复制代码
analyze table my_table compute statistics;  

analyze table my_table compute statistics for table for all indexes for all columns;   

analyze table my_table compute statistics for table for all indexes for all indexed columns;

analyze table my_table compute statistics;  
等价于:
analyze table my_table compute statistics for table for all indexes for all columns;

例子:

sql 复制代码
analyze table t1 compute statistics for table;
analyze table t2 compute statistics for all columns;
analyze table t3 compute statistics for all indexed columns;
analyze table t5 compute statistics for all indexes; 
analyze table t4 compute statistics;

另外,可以删除分析数据:

sql 复制代码
analyze table my_table delete statistics;

analyze table my_table delete statistics for table for all indexes for all indexed columns;
相关推荐
二哈喇子!8 分钟前
基于SSM框架的公交车查询系统的设计与实现
java·数据库·ssm
Coder_Boy_23 分钟前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
阿杰 AJie28 分钟前
MySQL 聚合函数总表(完整版)
数据库·mysql
玄同76537 分钟前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
cdut_suye39 分钟前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
尽兴-40 分钟前
MySQL 8.0高可用集群架构实战深度解析
数据库·mysql·架构·集群·高可用·innodb cluster
遇见火星1 小时前
MySQL常用命令大全(2026最新版)
数据库·mysql·oracle
霖霖总总1 小时前
[小技巧42]InnoDB 索引与 MVCC 的协同工作原理
运维·数据库·mysql
未来之窗软件服务1 小时前
计算机等级考试—数据库完整性进销存—东方仙盟练气期
数据库·oracle·计算机软考·仙盟创梦ide·东方仙盟
weixin_541299941 小时前
鸿蒙应用开发:保存应用数据 - 关系型数据库的使用
数据库·oracle·harmonyos