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;
相关推荐
普通网友3 分钟前
Python FastAPI 异步数据库管理
数据库·fastapi
晓子文集20 分钟前
Tushare接口文档:期货合约信息表(fut_basic)
大数据·数据库·金融·金融数据·量化投资
三言老师1 小时前
CentOS7.9:Redis‑Cluster集群部署结构化实战教程
linux·运维·服务器·数据库
旺仔学长 哈哈1 小时前
Spring Boot 智能停车场管理系统---附源码+数据库文档
数据库·spring boot·后端·智能停车场
ClickHouseDB2 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
数智化管理手记2 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌2 小时前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点3 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战3 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水3 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql