ORACLE的分区与索引

oracle的分区和索引可以说是它自己的亮点,可能你会说在其他数据库上也有,嗯是的,但oracle的种类性能便利性可以说是比较人性化的,下面我们通过实验来阐述它们的特性和功能。

1.分别给出一个B-tree索引针对全表扫描性能高和低的例子。

索引定义:oracle数据库中索引就是为了加快数据访问速度的一种目录结构

B-tree索引特点:

(1)二叉树结构

(2)用比较大小方式查找索引块

(3)适合创建在键值重复率低的字段

例如  主键字段:强调表的参照关系,即可以被外键引用

唯一性约束字段:强调字段键值的唯一性

(4)第一次扫描时,从root根节点进入,后面就不在返回进入了

(5)叶子与叶子之间有指针链,不用返回上一层,可以直接定位到下一个叶子节点

(6)主键字段做搜索时效率与数据量无关,例如1万条记录  1亿条记录检索效率差不多

(7)索引块是按顺序存放的,数据块是打散存放的

(8)结果集越小性能越好,结果集越大性能越不好

(9)相比位图索引,占用空间较多

实验

LEO1@LEO1> drop table leo1;

Table dropped.

LEO1@LEO1> drop table leo2;

Table dropped.

先清理环境,我们重新创建表和索引,看看在不同执行计划下的性能如何。

LEO1@LEO1> create table leo1 as select * from dba_objects;

Table created.

我们创建leo1表用于全表扫描

LEO1@LEO1> create table leo2 as select * from dba_objects;

Table created.

我们创建leo2表用于走B-tree索引

LEO1@LEO1> create index idx_leo2 on leo2(object_id);

Index created.

LEO1@LEO1> execute dbms_stats.gather_table_stats('LEO1','LEO1',cascade=>true);

PL/SQL procedure successfully completed.

LEO1@LEO1> execute dbms_stats.gather_table_stats('LEO1','LEO2',cascade=>true);

PL/SQL procedure successfully completed.

对leo1和leo2表及表上的索引进行统计分析,以便让oracle了解它们的数据分布情况

LEO1@LEO1> select table_name, num_rows, last_analyzed, object_type from dba_tab_statistics  where wner = 'LEO1';

TABLE_NAME                       NUM_ROWS  LAST_ANAL  OBJECT_TYPE

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

LEO1                                71961     09-JAN-13    TABLE

LEO2                                71962     09-JAN-13    TABLE

好已经显示出对2张表进行统计分析了,并且还知道了表上的数据有71961行和71962行

LEO1@LEO1> set autotrace traceonly      启动执行计划

LEO1@LEO1> select * from leo1 where object_id=10000;      

Execution Plan

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

Plan hash value: 2716644435

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

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |      |     1 |    97 |   287   (1)| 00:00:04 |

|*  1 |  TABLE ACCESS FULL| LEO1  |     1 |    97 |   287   (1)| 00:00:04 |

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

走全表扫描,代价Cost=287

Predicate Information (identified by operation id):

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

1 - filter("OBJECT_ID"=10000)           谓词条件

Statistics

时间: 2024-08-02 19:20:13

ORACLE的分区与索引的相关文章

oracle的分区索引和全局索引

分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响. 建立分区索引: create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4); 或者 create index idx_ta_c2 on ta(c2) local ; 另外在crea

Oracle分区表上的索引浅析

分区表上的索引分为:本地(局部)索引(local index) 和 全局索引(global index) 1.本地索引 (1)普通索引 SQL > CREATE INDEX INDEX_NAME ON TABLE (COLUMN) local ( partition part_idx_01 tablespace index_space01, partition part_idx_02 tablespace index_space02, partition part_idx_03 tablespa

oracle点知识8——索引组织表

关于索引的入门参照博客:http://blog.csdn.net/changyanmanman/article/details/7097318 索引组织表(index organized table, IOT)就是存储在一个索引结构中的表.存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序.对你的应用来说,IOT表和一个"常规"表并无二致. IOT有什么意义呢?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间.而IOT

EDB和Oracle在分区剪裁实践上的一点差别

前两天碰到一个问题,在EDB数据库中创建的一张分区表,需要使用分区本地索引和分区剪裁,但查看执行计划发现没能用到分区剪裁的功能. 创建分区表: CREATE TABLE test ( id bigint NOT NULL, bag_id bigint, bp_airline_code character varying(3), bp_flight character varying(5), bp_flight_suffix character varying(2), bp_flight_date

Oracle中如何管理索引组织表

索引组织表(IOT)有一种类B树的存储组织方法.普通的堆组织表是以一种无序的集合存储.而IOT中的数据是按主键有序的存储在B树索引结构中.与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值. 在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储.换句话说,IOT即是索引,又是实际的数据. 索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引.索引组织表的数

oracle数据库如何重建索引

  当索引的碎片过多时,会影响执行查询的速度,从而影响到我们的工作效率.这时候采取的最有利的措施莫过于重建索引了.本文主要介绍了Oracle数据库中检查索引碎片并重建索引的过程,接下来我们就开始介绍这一过程. 重建索引的步骤如下: 1. 确认基本信息 登入数据库,找到专门存放index 的tablespace,并且这个tablespace下所有index的owner都是tax.将index专门存放在一个独立的tablespace, 与数据表的tablespace分离,是常用的数据库设计方法. 2

oracle11g-求数据库高手,关于oracle表分区的

问题描述 求数据库高手,关于oracle表分区的 现在项目有一个表,数据累计了1亿多条了,查询特别慢,问了公司的老员工,他们说分表,请问现在能分表吗,最好能给个步骤 解决方案 http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm 在这个链接里面搜索"Partitioning Examples",在比较下面的位置.有各种例子,你可以看看哪个适用于你的情况

Oracle之不可见索引

Oracle之不可见索引 1  BLOG文档结构图   2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Oracle不可见索引的使用   Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同步更新 ② 文章中用到的所有代码,相关软

【索引】Oracle之不可见索引和虚拟索引的比对

[索引]Oracle之不可见索引和虚拟索引的比对    Oracle之不可见索引 :http://blog.itpub.net/26736162/viewspace-2124044/ Oracle之虚拟索引 :  http://blog.itpub.net/26736162/viewspace-2123687/   之前给大家分享过不可见索引和虚拟索引,今天给大家分享的是Oracle之不可见索引和虚拟索引的比对.   比较项目 不可见索引(Invisible Indexes) 虚拟索引(Virt