oracle分区索引介绍及实例演示

分区索引(或索引分区)主要为分区表,数据量的增长,普通堆表需要转换的分区表,及其指标转换为分区索引,分区索引的优势是明显的,它仅仅是一个指标分为多段,只有一个较小的索引碎片(块)可以访问时,获取所需的数据。同时,放置在不同的表空间可以提高分区的分区的可用性和可靠性。本文主要介绍了分区索引的相关特性,给出了一个实例。

1、分区索引的相关概念。

分区索引的几种方式:表被分割,索引没有被分区,表没有被分区,索引被划分,表和索引被划分。

分区索引可分为局部分区索引和全局分区索引。

局部分区索引:

本地分区索引信息的存储依赖于父表分区,也就是说,必须根据分区表创建本地索引。

默认情况下,当创建本地索引时,如果未指定索引,则自动存储表空间,并在数据分区时自动将本地索引存储在表空间中。

本地索引可以是B-树索引或位图索引,如表的分区机制。

本地索引是一个单独的分区,每个分区索引只指向一个表分区,这是一个对等分区。

本地索引支持分区独立性,因此对于这些单独的分区,不需要同时删除或重建截取、删除、分割和脱机处理。

本地索引主要用于数据仓库环境中。



全局分区索引:

当全局分区索引被索引时,分区表与全局索引不同,分区键的范围和值必须在创建时定义。

全局分区索引应该在创建全局关键字时创建,全局分区索引只能是B树索引。

全局索引可以分区或非分区,全局索引必须是前缀索引,也就是说,索引列必须包含分区键。

在全局索引分区中,分区索引可以指向n个表分区,而表分区也可以指向n个索引分区。

默认情况下,全局索引被添加到分区中,当索引的截取、删除和分区必须被重建或修改时,必须指定更新全局索引。

全局分区索引仅为一个范围或哈希散列分区。

全局分区索引主要用于OLTP系统。



前缀索引和非前缀索引

局部索引和全局分区索引分为前缀索引和非前缀索引。

前缀和非前缀索引都可以支持消除索引分区,前提是查询的条件包含索引分区键。

有一个前缀索引:

前缀索引包含分区键,也就是索引中包含分区键列。

前缀索引支持本地分区索引和全局分区索引。

非前缀索引:

如果没有前缀索引,分区键的前导列不作为索引的前导列。

非前缀索引只支持本地分区索引。



2。局部分区索引演示

复制代码代码如下所示:

环境

SQL >选择*从V版本rownum < 2美元;

旗帜

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

Oracle数据库10g企业版发布10.2.0.3.0 - 64bi

SQL >创建用户leshami经XXX;

已授予DBA leshami;

-创建演示所需的表空间

创建表空间的数据文件的SQL > tbs_tmp / / / sybo2 U02数据库 / / tbs_tmp oradata dbf'size 10m自动;

SQL >修改用户的默认表空间tbs_tmp leshami;

创建表空间的数据文件的SQL > tbs1 / / / sybo2 U02数据库 / / tbs1 oradata dbf'size 10m自动;

创建表空间的数据文件的SQL > tbs2 / / / sybo2 U02数据库 / / tbs2 oradata dbf'size 10m自动;

创建表空间的数据文件的SQL > tbs3 / / / sybo2 U02数据库 / / tbs3 oradata dbf'size 10m自动;

创建表空间的数据文件的SQL > IDX1 / / / sybo2 U02数据库 / / oradata IDX1 dbf'size 10m自动;

创建表空间的数据文件的SQL > idx2 / / / sybo2 U02数据库 / / idx2 oradata dbf'size 10m自动;

创建表空间的数据文件的SQL > idx3 / / / sybo2 U02数据库 / / oradata idx3 dbf'size 10m自动;

SQL> Conn leshami / XXX

-创建查找表

创建表(查找)

身份证号码(10),

描述VARCHAR2(50)

);

-添加主键约束

修改表查找(添加)

约束lookup_pk主键(ID)

);

插入数据

插入查找(ID,描述)值(1话);

插入查找(ID,描述)值(2,);

插入查找(ID,描述)值(3,);

承诺;

创建表(big_table

身份证号码(10),

created_date日期,

lookup_id号(10),

数据VARCHAR2(50)



按范围分区(created_date)

(分区big_table_2012值小于(to_date(01 / 01 / 2013,'dd /毫米/ yyyy))的表空间tbs1,

分区big_table_2013值小于(to_date(01 / 01 / 2014,'dd /毫米/ yyyy))的表空间tbs2,

分区big_table_2014值小于(次)表空间tbs3);



-将数据填充到分区表中

声明

l_lookup_id查找ID为型;

l_create_date日期;

开始

我在1…10000环路

如果mod(i,3)=0

l_create_date:= add_months(SYSDATE,- 24);

l_lookup_id:= 2;

elsif MOD(I,2)= 0

l_create_date:= add_months(SYSDATE,- 12);

l_lookup_id:= 1;

其他的

l_create_date:= SYSDATE;

l_lookup_id:= 3;

最后如果;



插入big_table(ID,created_date,lookup_id,数据)

(我的价值观,l_create_date,l_lookup_id,这是我| |一些数据);

结束循环;

承诺;

结束;

/

在不指定索引分区和存储表空间的情况下创建索引

已创建big_table指数bita_created_date_i(created_date)的地方;

建立索引。

SQL >选择index_name,partitioning_type partition_count,从user_part_indexes;

index_name分区partition_count

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

bita_created_date_i范围3

--作者:Leshami



从下面的查询中,索引直接存储到与表表相对应的表空间中。

SQL >选择partition_name,high_value tablespace_name,从user_ind_partitions;

partition_name high_value tablespace_name

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

big_table_2014次tbs3

big_table_2013 to_date('2014-01-01 00:00:00,'syyyy-m tbs2

m-dd hh24:MI:学生,'nls_calendar =格雷戈里亚

big_table_2012 to_date('2013-01-01 00:00:00,'syyyy-m tbs1

m-dd hh24:MI:学生,'nls_calendar =格雷戈里亚

删除索引

SQL >索引bita_created_date_i;

-指定索引分区名称、表空间名称、创建索引

SQL >创建索引bita_created_date_i

2 big_table(created_date)

3局部(

4 idx_2012 IDX1分区表空间,

5 idx_2013 idx2分区表空间,

6 idx_2014 idx3)分区表空间

7平行3;

建立索引。

SQL >选择partition_name,high_value tablespace_name,从user_ind_partitions;

partition_name high_value tablespace_name

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

idx_2014 MAXVALUE idx3

idx_2013 to_date('2014-01-01 00:00:00,'syyyy-m idx2

m-dd hh24:MI:学生,'nls_calendar =格雷戈里亚

idx_2012 to_date('2013-01-01 00:00:00,'syyyy-m IDX1

m-dd hh24:MI:学生,'nls_calendar =格雷戈里亚

SQL >选择*从big_table在rownum < 2;

我created_ lookup_id数据

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

1413201206252这是1413的一些数据。

-看看是否使用本地索引,从下面的执行计划中知道索引是用来支持分区消除的。

SQL >设置autot微量口;

SQL >选择*从big_table哪里created_date = to_date('20120625 ','yyyymmdd);

执行计划

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

计划哈希值:2556877094

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

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

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

| 0 | SELECT语句| | | | 1 41 2(0)| 00:00:01 | | |

1单个分区| | | | | | 1 41 2(0)| 00:00:01 | 1 | 1 |

表2 | |访问本地索引rowid | big_table | | | 1 41 2(0)| 00:00:01 | 1 | 1 |

3索引范围扫描| * | | bita_created_date_i | 1 | | 1(0)| 00:00:01 | 1 | 1 |

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



三.全局分区索引演示

复制代码代码如下所示:

-为表添加主键

SQL> ALTER TABLE big_table(添加

2约束big_table_pk主键(ID)

3);

表的改变。

SQL >选择index_name,index_type,tablespace_name,global_stats,分区

2从user_indexes哪里index_name = 'big_table_pk;

index_name index_type tablespace_name GLO PAR

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

big_table_pk正常tbs_tmp啊

SQL >设置autot微量口;

SQL> select * from big_table id是1412;



执行计划

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

计划哈希值:2662411593



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

我的名字|操作| | |行| |字节成本(CPU)时间| PStart Pstop | | |

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

| 0 | SELECT语句| | | | 1 62 2(0)| 00:00:01 | | |

1表访问的| |全局索引rowid | big_table | | | 1 62 2(0)| | | | 00:00:01 ROWID ROWID

2索引唯一扫描| * | | big_table_pk | 1 | | 1(0)| 00:00:01 | | |

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

-如上所述,在执行计划中,Pstart和Pstop是rowid

-全局索引rowid的出现,我们没有指定全局当我们添加主键,但执行计划表明,全局索引访问执行

-对于分区表,这一点仍有待确认,主键或非分区键上的唯一索引是否必须是全局索引。

SQL >索引bita_created_date_i;

-在下面创建全局索引,在创建时需要指定分区键的范围和值。

SQL >创建索引bita_created_date_i

在big_table(created_date)

在全球范围内分区(created_date)



分区

idx_1值小于(to_date(01 / 01 / 2013,'dd /毫米/ yyyy))

表空间IDX1,

分区

idx_2值小于(to_date(01 / 01 / 2014,'dd /毫米/ yyyy))

表空间idx2,

分区idx_3值小于(次)表idx3);

SQL >选择index_name,partitioning_type,partition_count,当地user_part_indexes;

index_name分区partition_count定位

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

bita_created_date_i_g全球范围3

SQL >选择partition_name,high_value tablespace_name,从user_ind_partitions;

partition_name high_value tablespace_name

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

idx_1 to_date('2013-01-01 IDX1

idx_2 to_date('2014-01-01 idx2

idx_3 MAXVALUE idx3

-下面是可以支持分区消除的执行计划

SQL >设置autot微量口;

SQL >选择*从big_table哪里created_date = to_date('20130625 ','yyyymmdd);

执行计划

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

计划哈希值:1378264218

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

我的名字|操作| | |行| |字节成本(CPU)时间| PStart Pstop | | |

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

| 0 | SELECT语句| | | | 1 41 2(0)| 00:00:01 | | |

1单个分区| | | | | | 1 41 2(0)| 00:00:01 | 2 | 2 |

2表访问的| |全局索引rowid | big_table | | | 1 41 2(0)| 00:00:01 | 2 | 2 |

3索引范围扫描| * | | bita_created_date_i | 1 | | 1(0)| 00:00:01 | 2 | 2 |

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

以下是一个范围查询,PStart 1和Pstop 2,同时也支持分区消除

SQL SELECT * FROM big_table >

2在created_date > = to_date('20120625 ','yyyymmdd)和created_date <= to_date('20130625 ','yyyymmdd);

执行计划

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

计划哈希值:213633793

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

我的名字|操作| | |行| |字节成本(CPU)时间| PStart Pstop | | |

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

| 0 | SELECT语句| | | 3334 133k | 14(0)| 00:00:01 | | |

1分区范围的迭代器| | | | | 3334 133k | 14(0)| 00:00:01 | 1 | 2 |

2表访问全| * | | | | big_table 3334 133k | 14(0)| 00:00:01 | 1 | 2 |

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