朋友在500w的表上建索引,半个小时都没有结束。所以就讨论如何提速。

一.先来看一下创建索引要做哪些操作:
1. 把index key的data 读到内存
==>如果data 没在db_cache 中,这时候很容易有大量的db file scatter read wait

2. 对index key的data 作排序
==>sort_area_size 或者pga_aggregate_target 不够大的情况下,需要做 disk sort, 会有大量的driect path read/write , 另外,消耗大量CPU Time

3. 创建新的index segment ,把排过序的index data 写到所创建的index segment 里面
==>如果index 很大,那么,有时也会有redo log 相关等待,如:
log buffer space ,log file sync , log file parallel write 等

所以,在建大表索引时,可以增大pga,增大temp tablepace,并且用nologging或并行选项。

如:
create index idx_logs on logs(time) nologging parallel 4;

并行度一般看CPU 个数。当然在CPU 比较空闲的情况下可以多并行几个。对于单CPU不建议用并行,这样反而会增加创建时间。也可以根据v$session_wait 的资料,做针对性的tuning , 这样可以降低点时间。

补充知识:

查看cpu 信息:more /proc/cpuinfo

查看内存信息:more /proc/meminfo

查看操作系统信息:more /etc/issue

有关索引概念性的东西,请参考我的Blog:

Oracle 索引 详解

http://blog.csdn.net/tianlesoftware/archive/2010/03/05/5347098.aspx

二. 测试

自己也测试了下。测试环境:Oracle 11g R2, win7 64bit ,CPU T6670 2.2G 双核, 内存:4G。

1. 查看表的数据量:

SQL> select count(*) from custaddr;

COUNT(*)

----------

7230464

2. 查看现有索引:

SQL> select index_name,index_type from user_indexes where table_name='CUSTADDR';

INDEX_NAME                     INDEX_TYPE

------------------------------ ---------------------------

PK_CUSTADDR_TP_723             NORMAL

IX_CUSTADDR_ADDRABB_TP         NORMAL

IX_CUSTADDR_TEAMID_TP          NORMAL

IX_CUSTADDR_CUSTID_TP          NORMAL

IX_CUSTADDR_COMPABB_TP         NORMAL

IX_CUSTADDR_AREACODE           NORMAL

IX_CUSTADDR_ADDR_TP            NORMAL

已选择7行。

3. 删除索引:IX_CUSTADDR_CUSTID_TP

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

4. 默认方式创建索引:

SQL> SET timing on;

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID );

索引已创建。

已用时间:  00: 00: 48.37

单位:s

5. 用nologging 模式:
SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.09
SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING;

索引已创建。

已用时间:  00: 00: 34.46

6. Nologging+ parallel 模式

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.17

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING PARALLEL 2;

索引已创建。

已用时间:  00: 00: 52.56

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.07

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID )  NOLOGGING PARALLEL 4;

索引已创建。

已用时间:  00: 00: 53.44

看来在单CPU上,并行效果还不好.

7. Parallel 模式

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.02

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID ) PARALLEL 2;

索引已创建。

已用时间:  00: 00: 49.97

SQL> drop index IX_CUSTADDR_CUSTID_TP ;

索引已删除。

已用时间:  00: 00: 00.02

SQL> CREATE INDEX  IX_CUSTADDR_CUSTID_TP ON CUSTADDR (CUSTID ) PARALLEL 4;

索引已创建。

已用时间:  00: 00: 50.25

从上面的测试数据可以看出,700万的数据,建索引,也在1分钟以内。 但是并行在单CPU上效果不明显,而且比光使用NOLOGGING还要慢,因为出现资源争用了,可能是CPU的争用,也可能是I/O的争用。

转: http://blog.csdn.net/tianlesoftware/article/details/5664019

如何加快建 index 索引 的时间的更多相关文章

  1. PLSQL_性能优化系列01_Oracle Index索引

    2014-06-01 Created By BaoXinjian

  2. MySQL查询优化之 index 索引的分类和使用

    索引的分类 主键索引 (PRIMARY KEY) 唯一的标识符, 主键不可重复, 只能有一列作为主键 唯一索引 (Unique KEY) 避免重复的列出现, 唯一索引可以重复, 多个列都可以标识为唯一 ...

  3. SAP建数据库索引

    [转]SAP建数据库索引   %_hints  db6 'INDEX("MKPF","MKPF~BUD")'           db6 'INDEX(&quo ...

  4. SQL Server获取索引创建时间&重建时间&重组时间

    之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild ...

  5. Neo4j:Index索引

    Indexing in Neo4j: An Overview by Stefan Armbruster · Jan. 06, 14 · Java Zone Neo4j是一个图数据库,在做图的检索时,用 ...

  6. nexus私服update repair index索引失败解决方案(转)

    转载地址:http://blog.csdn.net/first_sight/article/details/51559086 问题描述: 搭建Maven的Nexus私服仓库,一般安装完Nexus后,默 ...

  7. 加NONCLUSTERED INDEX索引,在ON了之后还要INCLUDE

    之前加了索引,但效果不大 SET STATISTICS TIME ON --执行时间 SET STATISTICS IO ON --IO读取 DBCC DROPCLEANBUFFERS --清除缓冲区 ...

  8. py-day1-6 python 5个灰魔法 【len,index索引,for循环,切片】

    # 索引,下标,获取字符串中的某一个字符. test = 'MuMingJun' v = test[3] print(v) i # 切片 test = 'MuMingJun' v = test[0:- ...

  9. index索引的一些简单理解

    index索引(普通索引,允许出现相同的索引内容) 1.索引 索引是在数据量和访问量较大的时候,而出现的一种优化数据库的手段 索引可以提高查询(select)的效率,但相应的,它的 INSERT 与 ...

随机推荐

  1. java 匿名类和匿名方法

    package com.test; interface product{ int getPrice(); } public class News { /** * @param args */ publ ...

  2. Android 进阶自定义 ViewGroup 自定义布局

    前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等.但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经 ...

  3. mongo 的逻辑存储和物理存储

    逻辑存储空间与物理存储空间有差距的主要原因 存储引擎存储时,需要记录一些额外的元数据信息,这会导致物理空间总和比逻辑空间略大 存储引擎可能支持数据压缩,逻辑的数据块存储到磁盘时,经过压缩可能比逻辑数据 ...

  4. Docker入门系列8

    commit docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser ...

  5. Python 时间格式化(转)

    From:http://www.cnblogs.com/65702708/archive/2011/04/17/2018936.html http://www.wklken.me/posts/2015 ...

  6. 【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题

    无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占 ...

  7. python 基础 5.2 类的继承

    一. 类的继承 继承,顾名思议就知道是它的意思,举个例子说明,你现在有一个现有的A类,现在需要写一个B类,但是B类是A类的特殊版,我们就可以使用继承,B类继承A类时,B类会自动获得A类的所有属性和方法 ...

  8. 【WinForm】创建自定义控件(转)

    转自:http://www.cnblogs.com/bomo/archive/2012/12/09/2810559.html 虽然VS为我们提供了很多控件可以使用,但有时候这些控件仍然不能满足我们的要 ...

  9. 九度OJ 1057:众数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8431 解决:2819 题目描述: 输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的 ...

  10. packages/wepy-web/src/wx.js 分析storage 的加载原理 wx.getStorage(OBJECT)

    是小程序实例化后 读入内存 还是每次调用从文件系统读取 https://github.com/Tencent/wepy/blob/bd0003dca2bfb9581134e1b05d4aa1d80fc ...