PLSQL_性能优化系列13_Oracle Index Rebuild索引重建

2014-10-04 Created By
BaoXinjian

阅读原文-关注自己之博客

图片 1一、摘要



于软件开发中必不可少的会触发到一个词语–多线程;
那么什么是多线呢,本文主要是对多线程的基础知识做简单讲解。

目重建是一个争被频频热烈谈论的议题。当然Oracle官方也发出温馨的观,我们许多DBA也是按这同一按则来重建索引,那即便是Oracle建议对于索引深度超过4层及曾经抹的目条目至少占现有索引条目总数的20%
这2种植状态下得重建索引。近来Oracle也提出了有的与的相反的看法,就是强烈建议不要定期重建索引。本文是参照了1525787.1并开展对应描述。


 

1 基本概念

  1. 重建索引的理由

  2.  Oracle的B树索引随着年华的延迟变得无抵(误解)

  3.  索引碎片在连长
  4.  索引不断追加,删除的空中没有重复使用
  5.  索引 clustering factor
    (集群因子)不齐,可以经重建修复(误解)

  6. 重建索引的真相

1.1 进程的概念

  • 过程是乘当系正周转的一个应用程序,每个过程是相对独立

    eg: 当我们启动QQ,那么尽管会见敞开一个经过

   
本质:重建索引在数据库里是预先实施删除操作,再履行插入操作。

1.2 线程的定义

  • 每个过程被最少要出同等长长的线程。(一个主次的拥有任务还是当线程中实行的)
  • 一个线程中任务的实行是串行的
  1. 不予重建索引的理由

1.3 多线程的概念

  • 一个过程被可初步多长达线程,每条线程可以相互(同时)执行
    • 主线程 : 自动创建的,默认的 又给UI线程
    • 子线程 : 又受后台线程

(1). 大多数下论还依靠 index_stats
动态表。此表使用以下命令填充:

大抵线程原理
  • CPU同一时间只能发出相同长线程在做事,其实是CPU快速的于差不多漫长线程之间调度(切换);调度频率快,就形成了差不多线程同时施行的“假象”。所以移动端不建议开太多线程一般在5长达中

analyze index … validate
structure;

大抵线程优缺点
  • 可取:能适用增强履效率、资源(CPU,内存)利用率
  • 短:开启线程占用内存,开销大,性能降低

尽管这是一致种植中之目检查方式,但是它在条分缕析索引时会见获取独占表锁。对于大型索引,其影响会是了不起的,因为在此期间不允对表执行DML
操作。

多线程在iOS开发被之采取
  • 默认有一样久主线程(UI线程)有还只发生一致长达。作用:负责显示与刷新界面,处理UI事件

    只顾:不要拿耗时操作放在主线程中

尽管该方法可于不锁表的事态下在线运行,但是也许使消耗额外之年华。

2 iOS中几近线程的实现方案

(2). 重建索引的直接结果是 REDO
活动可能会见增多,总体系统负荷也或会见加强。

3 pthread的例子

    - (void)viewDidLoad {
        [super viewDidLoad];

        // 创建一个线程标识符
        pthread_t myrestrict;

        // 1param 线程标识符变量的地址, 2param 写NULL 3param 执行的的函数 4param NULL
        pthread_create(&myrestrict, NULL, run, NULL);
    }

    // 定义线程的函数
    void *run(void *data) {

        NSLog(@"%@", [NSThread currentThread]);

        return nil;
    }

插入/更新/删除操作会导致索引随着索引的细分和加强不断升华。

4 NSThread的骨干用法

重建索引后,它将接连的愈来愈紧凑;但是,随着对表不断推行
DML 操作,必须重新分割索引,直到索引达到平衡了。

创造方式1 创立后需要启动

//创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil];

// 启动线程
[thread start];

结果,重做活动多,且索引分割更起或针对性能有直接影响,因为咱们要拿再多的
I/O、CPU 等用于索引重建。

创造方式2 创建后自动启动

// 创建后直接启动  传一个字符串
[NSThread detachNewThreadSelector:@selector(download2:) toTarget:self withObject:@"param"];

由此一段时间后,索引可能会见再度相遇“问题”,因此可能会见再次叫记为重建,从而陷入恶性循环。

创建方式3 隐式启动

// 开启子线程
[self performSelectorInBackground:@selector(download) withObject:nil];

// 开启主线程
[self performSelector:@selector(download) withObject:nil];

// 开启传入的线程
[self performSelector:@selector(download) onThread:[NSThread currentThread] withObject:nil waitUntilDone:NO];

据此,通常最是让索引处于自然平衡与(或)至少要防范定期重建索引。

另外常用方法

// 获取当前线程
NSThread *current = [NSThread currentThread];
// 获取主线程
NSThread *main = [NSThread mainThread];
// 判断是否主线程-类方法
BOOL isMain = [NSThread isMainThread];
// 判断是否主线程-对象方法
BOOL isMain2 = [main isMainThread];
// 给线程起名字
current.name = @"下载线程";
// 线程睡眠状态5秒
[NSThread sleepForTimeInterval:5.0];
// 线程睡眠从现在开始3秒以后的时间
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
// 线程退出 线程进入死亡状态
[NSThread exit];
  1. Oracle的末尾建议

线程之间的通信

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
  • waitUntilDone: 是否等执行完 performSelector:执行的点子 withObject:
    传参数

    一般而言,极少要重建 B
树索引,基本由是 B 树索引好非常程度达可自我管理或我平衡。

5.线程安全

  • 线程安全
    • 概念 : 多单线程夺取同一个资源,访问一个变量
    • 釜底抽薪方案 : 加锁–线程锁, 互斥锁
    • 互斥锁的格式 :

@synchronized(self) { 
    // 插入锁定代码 
  }

* >注意 : 一份代码只能用一个锁, 多个锁无效
  • 线程锁优缺点

    • 优点 : 能够有效防护因多线程抢夺资源造成的数额安全题材
    • 缺点 : 消耗大量CPU资源
  • 线程同步

    • 基本上修线程在同条线上实施(按梯次执行)
    • 互斥锁就应用了线程同步
  • 原子属性与非原子属性

    • atomic 会自动吗setter方法加锁
    • nonatomic 不会见也setter方法 推荐以此

   
大多数目都能保障平衡和整,因为空闲的叶条目可以重复使用。

6.基本上线程状态示意图

   
插入/更新和去操作确实会造成索引块周围的可用空间形成碎片,但是一般的话这些碎片都见面为科学的用。

以打听了线程安全后我们再看看完整的线程状态示意图

    Clustering
factor群集因子反映了加的搜寻引键值所对应之表中的数目排序情况。重建索引不会见指向群集因子产生震慑,集群因子只能通过重组表的数额变动。

   
强烈建议不要定期重建索引,而应采用相当的确诊工具。

   
个人结论,如果重建索引的光辉工作量和的对应之是最最小之收入,那便得不偿失。如果系统发出可用空闲期,重建之前和后的测量结果表明性能有增进,值得重建。

  1. 精益求精方法

    通常是先考虑index
coalesce(索引合并),而不是重建索引。索引合并出如下优点:

  •  不需要占用近磁盘存储空间 2
    倍增的半空中
  •  可以在线操作
  •  无需重建索引结构,而是连忙地集合索引叶块,这样只是免系统开发了死。

  • 真的用重建索引的情状

  •  索引或探寻引分区因介质故障坏

  •  标记为UNUSABEL的目录需要重建
  •  索引移动至新的表空间或用改变一些存储参数
  •  通过SQL*Loader加载数据到表分区后,需要重建索引分区
  •  重建索引以启用键压缩
  •  位图索引本质不同于B树引得,建议重建

 

图片 2二、案例


目是增进数据库查询性能的兵不血刃武器。

尚无索引,就哼于图书馆没有书标签一样,找一本书自己想使的书比较登天尚难。

但索引在应用的历程被,尤其是当批量之DML的状下会时有发生相应的碎,以及B树高度会产生相应变更,因此得以对这些变迁较充分的目录进行重构以增进性。

N久先Oracle建议我们定期重建那些高度为4,已抹的目录条目至少占现有索引条目总数的20%之这些表上的目录。

唯独Oracle现在强烈建议不要定期重建索引。

 

Thanks and Regards

参考:了沙弥
http://blog.csdn.net/leshami/article/details/23763963

参考:了沙弥
http://blog.csdn.net/leshami/article/details/24266247

图片 3