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;
相关推荐
发仔1237 分钟前
Oracle与MySQL核心差异对比
mysql·oracle
宇钶宇夕16 分钟前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
爱可生开源社区40 分钟前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行1 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax1 小时前
Redis总结
数据库·redis·redis重点总结
椰椰椰耶1 小时前
【MyBatis】XML实现,配置方法和增、删、改、查
xml·oracle·mybatis
一屉大大大花卷2 小时前
初识Neo4j之入门介绍(一)
数据库·neo4j
周胡杰3 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0013 小时前
navicate如何设置数据库引擎
数据库·mysql
赵渝强老师3 小时前
【赵渝强老师】Oracle RMAN的目录数据库
数据库·oracle