`
netfork
  • 浏览: 489380 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

转载 检查索引碎片(oracle)

    博客分类:
  • DB
阅读更多

早上收到Olga Email, 希望我检查下某个oracle数据库索引碎片,并且rebuild index.
 
原因:每月定期执行的索引重建任务应为某些原因失败了,并且延续了半年,客户怀疑是否有索引碎片,希望重建索引。
 
情况:不知道这个oracle是干么用的,确切地说是第一次看到,所以只能用一般的常识去处理这个help call.
 
步骤如下:
 
1.  确认基本信息。 
登入数据库,找到专门存放index 的tablespace,并且这个tablespace下所有index的owner都是tax.将index专门存放在一个独立的tablespace, 与数据表的tablespace分离,是常用的数据库设计方法
 
2. 查找哪些index需要重建
通过anlyze index .... validate structure命令可以分析单个指定的index,并且将单个index 分析的结果存放到 index_stats试图下。一般判断的依据是:
 
  • height >4
  • pct_used < 50%
  • del_lf_rows / lf_rows +0.001 > 0.03
3. google上下载了遍历所有index脚本
发现anlyze index .... validate structure只能填充单个index分析信息,于是google了下,从网上下了个Loop 脚本,遍历索引空间下所有的索引名字,并且可以把所有index的分析信息存放到自己建立的一个用户表中。
 
4. anlyze index 锁定index
发现下载的脚本不好用,应为anlyze index 在分析索引前要争取独占锁,锁住index,  很明显有些index正在被应用系统的使用,所以运行anlyze失败。这里吸取的教训是,尽量晚上做这种事。但是本人比较喜欢准时回家,所以在语句中添加Exception Handler, 抛出anlyze index执行失败的那些index 名称,使脚本正常运行完毕。并且根据打印到前台的index name手动执行那些index分析。
 
5. 总结
虽然发现522个index中有160个符合上面的判断的依据。但是发现索引都不大,而那些拥有百万leaf的索引又没有符合上面的判断条件,所以结论是无需index rebuild online. 没有啥碎片。
 
6.客户于是问,什么时候可以rebuild index呢?
回答他,rebuild index online, 对那些有大量DML操作的大索引是有益的。可以每个月季度做一次针对较大索引的rebuild。通常哪怕rebuild index online也会造成I/O争用,所以有无online意义不大,可以放到3-5个晚上,分批执行rebuild index, 锁定index,不让用户用 (没有用户等入的时候),并且加上paralle 8关键字,应为发现数据库服务器有8个cpu processors.
 
后续: 啥事情也没有干,按时回家了。


analyze index ... validate structure 然后查询 index_stats
DEL_LF_ROWS于LF_ROWS的比例 这是最基本的了
可以通过程序来实现该功能
注意:analyze index 和查询index_stats 必须在同一个session中
create table MONITORINDEX
(
  INDEX_NAME  VARCHAR2(50),
  DEL_LF_ROWS NUMBER,
  LF_ROWS     NUMBER,
  RATE        NUMBER(4,2),
  MONITORDATE DATE default sysdate not null
)
create or replace procedure analyzeindex is
  v_sql varchar2(100);
begin
  for a in (select index_name from all_indexes where owner = USER) loop
    v_sql := ' analyze index ' || a.index_name || ' validate structure';
    execute immediate v_sql;
    insert into monitorindex
      (index_name, del_lf_rows, lf_rows, rate)
      select name,
             del_lf_rows,
             lf_rows,
             round(del_lf_rows * 100 / (lf_rows + del_lf_rows), 2)
        from index_stats;
  end loop;
end analyzeindex;




create table MONITORINDEX
(
  INDEX_NAME  VARCHAR2(50),
  DEL_LF_ROWS NUMBER,
  LF_ROWS     NUMBER,
  RATE        NUMBER(4,2),
  MONITORDATE DATE default sysdate not null
)
create or replace procedure analyzeindex is
  v_sql varchar2(100);
begin
  for a in (select index_name from all_indexes where owner = USER) loop
    v_sql := ' analyze index ' || a.index_name || ' validate structure';
    execute immediate v_sql;
    insert into monitorindex
      (index_name, del_lf_rows, lf_rows, rate)
      select name,
             del_lf_rows,
             lf_rows,
             round(del_lf_rows * 100 / (lf_rows + del_lf_rows), 2)
        from index_stats;
  end loop;
end analyzeindex;

call analyzeindex();

create or replace procedure clearallindex is
  v_sql varchar2(100);
begin
  for a in (select index_name from all_indexes where owner = USER) loop
    v_sql := ' alter index ' || a.index_name || ' rebuild';
    execute immediate v_sql;
  end loop;
end clearallindex;

call clearallindex();
分享到:
评论

相关推荐

    Oracle解决索引碎片功能.txt

    ### Oracle解决索引碎片功能详解 #### 索引碎片概念 在Oracle数据库中,索引碎片是指由于频繁的数据插入、删除操作导致索引结构变得不连续和分散的现象。这种现象会降低查询性能,增加数据库维护成本。因此,了解...

    oracle查询表碎片

    因此,定期检查表碎片情况并采取相应措施是数据库管理员的一项重要工作。 #### 二、SQL查询语句解析 给出的SQL查询语句主要用于查询表`Q_ACCT_PROCESS`的碎片情况: ```sql SELECT table_name, ROUND((blocks * ...

    数据库 创建索引 sql oracle

    "数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...

    Oracle碎片整理全面解析

    ### Oracle碎片整理全面解析 #### 一、Oracle碎片概述 Oracle数据库作为一种广泛应用于企业级环境中的关系型数据库管理系统,其高效稳定的表现得到了业界的认可。然而,在长时间运行后,数据库可能会出现碎片化...

    Oracle索引分析与比较

    Oracle 索引是数据库管理系统中提升数据查询速度的关键组件,尤其在大型企业级应用中,选择合适的索引类型对于数据库性能至关重要。本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数...

    oracle约束和索引笔记

    本笔记主要探讨了两个关键概念:约束和索引,这些都是Oracle数据库中的基础但至关重要的元素。 **1. 约束(Constraints)** 约束是Oracle数据库中用于确保数据完整性的规则。它们分为以下几种类型: - **非空约束...

    Oracle在线建立超大表的索引

    ### Oracle在线建立超大表的索引 #### 需求背景 在Oracle数据库中,为含有千万级别记录的大表创建索引是一项挑战性任务,尤其是对于那些处于高并发在线生产环境中的表。本文将详细介绍如何为一个核心大表(INFO_...

    oracle不走索引可能原因.docx

    Oracle数据库在执行SQL查询时,有时会选择不使用已经创建的索引,这可能是由于多种因素导致的。以下是一些常见的原因及其详细解释: 1. **INDEX SKIP SCAN**: 当创建了一个组合索引,但是查询只使用了索引的非第一...

    Oracle索引检查重建与碎片收集[文].pdf

    总结来说,对Oracle数据库中的索引进行定期检查、碎片收集和必要的重建是保持系统高效运行的重要环节。理解并熟练掌握这些技巧,能够帮助数据库管理员有效地管理和优化数据库性能,确保软件开发的平稳进行。

    oracle创建表创建唯一索引

    在Oracle数据库管理系统中,创建表和唯一索引是数据库设计中的关键步骤,它们对于数据的组织、查询效率和数据完整性至关重要。以下将详细介绍如何创建学员信息表,创建唯一索引,以及如何修改表来添加主键和检查约束...

    oracle、sql数据库批量建索引

    Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理索引以优化查询速度。本文将深入探讨这两个数据库系统中如何批量创建和删除索引,以及它们对系统运行效率的影响。 首先,让我们了解...

    Oracle碎片整理

    Oracle数据库在长期运行过程中,由于数据的增删改操作,会导致数据存储不连续,形成所谓的“碎片”。碎片整理是数据库维护的重要环节,旨在优化数据库性能和提高空间利用率。 1. 碎片的产生 Oracle数据库中,表空间...

    oracle 创建和删除索引

    例如,当数据频繁插入或删除时,可能会导致索引碎片化,进而影响查询性能。 2. **性能影响**:虽然索引可以加速查询操作,但也会对插入、更新和删除操作产生一定的负面影响,因为每次这些操作发生时,都需要更新索引...

    oracle索引与分区索引介绍

    Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...

    为什么oracle有时不用索引来查找数据

    ### Oracle为何有时不使用索引来查找数据 Oracle数据库在处理SQL查询时,会根据一系列复杂的因素决定是否使用索引以及如何高效地检索数据。本文将深入探讨Oracle在哪些情况下可能会选择不使用索引的原因,并解释...

    oracle在线创建索引和重组索引

    创建完成后,需要马上检查系统应用,如果发现有错误走到该索引的语句,并且有严重影响的,可能需要立即删除该索引或者约束。 二、重组索引 重组索引可以减少索引的碎片化和空间浪费。如果索引因为更新太频繁或者是...

    oracle的索引学习

    Oracle数据库中的索引是提升查询性能的关键工具,它允许数据库快速定位和检索数据。本篇文章将深入探讨Oracle索引的学习,重点关注索引的原理、类型、优缺点以及如何使用和分析执行计划。 首先,理解索引的基本概念...

    oracle表空间碎片整理

    利用DBMS_SPACE包对Oracle 表碎片进行监控与清理,

    [Oracle]如何在亿级记录表中创建索引

    ### Oracle中亿级记录表创建索引的知识点详解 #### 一、背景介绍 在Oracle数据库中处理亿级数据量的表时,合理的索引设计是优化查询性能的关键因素之一。索引能够加快数据检索的速度,减少I/O操作次数,但同时也...

Global site tag (gtag.js) - Google Analytics