Oracle表与索引的分析及索引重建

1.分析表与索引(analyze 不会重建索引)

analyze table tablename compute statistics 
等同于 analyze table tablename compute statistics for table for all indexes for all columns

for table 的统计信息存在于视图:user_tables 、all_tables、dba_tables

for all indexes 的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes

for all columns 的统计信息存在于视图:user_tab_columns、all_tab_columns、dba_tab_columns

注:分析表与索引见 AnalyzeAllTable存储过程

2、一般来讲可以采用以下三种方式来手工分析索引。
analyze index idx_t validate structure:
analyze index idx_t compute statistics:
analyze index idx_t estimate statistics sample 10 percent

1)analyze index idx_t validate structure:
这段分析语句是用来分析索引的block中是否有坏块儿,那么根据分析我们可以得到索引的结构数据,这些数据会保留到
index_stats中,来判断这个索引是否需要rebuild. 需要注意的是这样的分析是不会收集索引的统计信息的。

2)validate structure有二种模式: online, offline, 一般来讲默认的方式是offline。
当以offline的模式analyze索引时,会对table加一个表级共享锁,对目前table的一些实时DMl操作会产生一定的影响。
而以online模式分析时候,则不会加任何lock,但在index_stats中是看不到任何信息的。

3)analyze index idx_t compute statistics:
用来统计索引的统计信息(全分析),主要为CBO服务。

4)analyze index idx_t estimate statistics sample 10 percent
主要是用来指定比例进行抽样分析,也是为CBO服务. 例中是抽样10%

3.重建索引
alter index index_name rebuild tablespace tablespace_name 
alter index index_name rebuild tablespace tablespace_name 加入表空间名,会将指定的索引移动到指定的表空间当中。

注:
analyze 操作只是统计信息,并将统计信息存放起来供日后分析SQL使用,不进行重建之类的具体实施性操作,因此要重建索引的话
还是要用 alter index index_name rebuild

4、其他的统计方法

1)DBMS_STATS:这个当然是最强大的分析包了
--创建统计信息历史保留表
exec dbms_stats.create_stat_table(ownname => ‘scott‘,stattab => ‘stat_table‘);

--导出整个scheme的统计信息
exec dbms_stats.export_schema_stats(ownname => ‘scott‘,stattab => ‘stat_table‘);

--分析scheme
Exec dbms_stats.gather_schema_stats(ownname => ‘test‘,options => ‘GATHER AUTO‘,
                                       estimate_percent => dbms_stats.auto_sample_size,
                                       method_opt => ‘for all indexed columns‘,
                                       degree => 6 );

--分析表
exec dbms_stats.gather_table_stats(ownname => ‘TEST‘,tabname => ‘sm_user‘,estimate_percent => 10,method_opt=> ‘for all indexed columns‘) ;

--分析索引
exec dbms_stats.gather_index_stats(ownname => ‘TEST‘,indname => ‘pk_user_index‘,estimate_percent => ‘10‘,degree => ‘4‘) ;

--如果发现执行计划走错,删除表的统计信息
exec dbms_stats.delete_table_stats(ownname => ‘TEST‘,tabname => ‘SM_USER‘) ;

--导入表的历史统计信息
exec dbms_stats.import_table_stats(ownname => ‘TEST‘,tabname => ‘SM_USER‘,stattab => ‘stat_table‘) ;

--如果进行分析后,大部分表的执行计划都走错,需要导回整个scheme的统计信息
exec dbms_stats.import_schema_stats(ownname => ‘TEST‘,stattab => ‘SM_USER‘);

--导入索引的统计信息
exec dbms_stats.import_index_stats(ownname => ‘TEST‘,indname => ‘PK_USER_INDEX‘,stattab => ‘stat_table‘)

analyze和dbms_stats不同的地方:
analyze是同时更新表和索引的统计信息,而dbms_stats会先更新表的统计信息,然后再更新索引的统计信息,
这里就有一个问题,就是当表的统计信息更新后,而索引的统计信息没有被更新,这时候cbo就有可能选择错误的plan

2)DBMS_UTILITY.ANALYZE_SCHEMA:可直接分析SCHEMA中所有对象
   如:EXEC DBMS_UTILITY.ANALYZE_SCHEMA (‘LTTFM‘,‘COMPUTE‘);

3)DBMS_DDL.ANALYZE_OBJECT:收集对象的的统计信息

时间: 2024-08-01 16:16:39

Oracle表与索引的分析及索引重建的相关文章

41.oracle索引,分析索引,索引碎片整理

概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络): 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表数据,索引能优化查询,不能优化DML,oracle自动维护索引,频繁的DML操作反而会赢钱大量的索引卫华. 如果sql语句仅仅访问被索引的列,那么数据库只需从索引中读取数据,而不会读取表:如果该语句还要访问未被索引的列,那么数据库会使用rowid来查找表中的行,通常,为检索表数据,数据库以交换方式先读取索引块,然后读取对应的表. 索引的目的是减少IO

oracle如何进行索引监控分析和优化

在生产环境.我们会发现: ① 索引表空间 I/O 非常高     ② "db file sequential read" 等待事件也比较高   这种迹象表明.整个数据库系统.索引的读写操作比较多.已经成为系统的主要瓶颈      一般的原因.大抵如下:   ① 大量SQL均采用索引   ② DML操作导致索引维护工作量暴增   ③ 频繁DML导致很多索引碎片.增加I/O开销   ④ 索引建立策略失误.走索引如同全表扫      如果.一张表字段30个.但索引竟有 50个!?   作为

[转]Oracle 索引质量分析

http://blog.csdn.net/leshami/article/details/23687137 索引质量的高低对数据库整体性能有着直接的影响.良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置.因此对于索引在设计之初需要经过反复的测试与考量.那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能.下面给出了演示以及索引创建的基本指导原则,最后给出了索引

Oracle性能分析9:重建索引

当索引出现问题时,会导致严重的性能问题,索引问题包括索引不可用.索引碎片导致性能下降,我们需要一些手段在检测索引的问题,并解决这些问题.这一篇将为你讲述怎么定位索引问题,并提供了解决的办法. 索引不可用 索引不可用的原因有很多,包括: 1)索引空间耗尽,导致SQL*Loader更新索引失败: 2)创建索引的过程中实例失败: 3)唯一键有重复值: 4)某个索引的顺序与sorted indexes子句中指定的顺序不同: 5)移动表或表分区(alter table move和alter table m

Oracle 表分区与索引分区

分区技术简介 Oracle是最早支持物理分区的数据库管理系统供应商,表分区的功能是在Oracle 8.0版本推出的.分区功能能够改善应用程序的性能.可管理性和可用性,是数据库管理中一个非常关键的技术.尤其在今天,数据库应用系统的规模越来越大,还有海量数据的数据仓储系统,因此,几乎所有的Oracle数据库都使用分区功能来提高查询的性能,并且简化数据库的日常管理维护工作. 那么使用分区技术有哪些优点呢?具体如下: 减少维护工作量,独立管理每个分区比管理单个大表要轻松得多. 增强数据库的可用性,如果表

ORACLE表、索引和分区

一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两个参数:  PCTFREE:自由空间,默认值10 PCTUSED(只适用于MSSM):默认值40 设置这两个参数很重要:  一方面避免迁移过多的行,影响性能  一方面避免浪费太多的空间 当自由空间存不下更新后的某一行时,这一行将会发生行迁移,在两个块上存储这一行数据,如下图: 2.堆组织表 基本上我们使用的表都是堆组织表(he

oracle中查看当前用户的表结构、主键、索引

1.查询表的所有列及其属性 select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表 2.查找表的所有索引(包括索引名,类型,构成列) select t.*,i.index_type from user_ind_columns t,user

oracle表分区与索引分区

今天是2016年4月13号,清晨据说是50年来深圳最大的雨把我给吵醒了,上午腾讯新闻弹出新闻说这是谣言~!我信了~! 今天把tiptop的一个功能实现了~心情还不错.不瞎扯了,今天开始学习oracle表分区和索引分区!坚持就是胜利~ oracle是支持物理分区的数据库管理系统,据说是最早支持的!优点如下 1:减少维护工作量,独立管理每个分区比管理大的单分区简单 2:数据可用性增强,一个分区坏了不影响所有数据 3:提高查询速度 4:均衡I/O 创建表分区 create table ware_ret

Oracle 表的访问方式(2)-----索引扫描

索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引查找(index lookup).一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块.在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值.索引扫描可以由2步组成: (1) 扫描索引得到对应的rowid值. (2)