热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle索引分区介绍

Oracle索引分区介绍一.概述和表分区一样,索引也可以进行分区。oracle中对索引进行分区有两种方式:1.每一个索引分区对应一个表分区,而且只索引该表分区。也就是有多少个表分区就有多少个索引分区...SyntaxHighlighter.all();

Oracle索引分区介绍
 
一. 概述
      和表分区一样,索引也可以进行分区。oracle中对索引进行分区有两种方式:
     1. 每一个索引分区对应一个表分区,而且只索引该表分区。也就是有多少个表分区就有多少个索引分区。称之为局部分区索引。
 
     2. 索引按照区间分区(或者散列分区),一个索引可以指向任何表分区的数据。索引分区个数与表分区个数没有关系,称之为全局分区索引。
 
     二. 局部索引
     oracle中有两类局部索引:局部前缀索引和局部非前缀索引。看例子:
   www.2cto.com  
Sql代码  
CREATE TABLE partitioned_table ( a int, b int, data char(20) )   
PARTITION BY RANGE (a)   
( PARTITION part_1 VALUES LESS THAN(2) tablespace p1,   
PARTITION part_2 VALUES LESS THAN(3) tablespace p2 )  
 
      如上语句创建了一个表,分成了2个区。a小于2的放在part_1区,a大于2小于3的放在part_2区。接着我们创建两个局部索引:
      
Sql代码  
  
create index local_prefixed on partitioned_table (a,b) local;   
  
create index local_nonprefixed on partitioned_table (b) local;   
 
     往表里面插入一些数据:
 
Sql代码  
insert into partitioned_table select mod(rownum-1,2)+1, rownum, 'x' from all_objects;  
   www.2cto.com  
        将表空间p2离线,也就是part_2分区变成不可用:
 
Sql代码  
alter tablespace p2 offline;   
 
      执行如下查询: 
Sql代码  
select * from partitioned_table where a = 1 and b = 1;   
      能够执行成功,使用的局部前缀索引,只查询了part_1分区。
 
     执行第二个查询:
 
Sql代码  
select * from partitioned_table where b = 1;   
       执行失败,使用的局部非前缀索引,其实这里与使用哪一种类型的局部索引木有关系,b=1的数据不能确定都在part_1区,故part_2分区也需要查找,由于part_2分区已经不可用,故查询失败。   
        将局部前缀索引删除,继续查询如下:
   www.2cto.com  
Sql代码  
drop index local_prefixed;   
select * from partitioned_table where a = 1 and b = 1;   
      执行成功,这个时候只能使用局部非前缀索引,也只会扫描part_1分区,因为表分区已经定义了a小于2的值放在part_1分区。
       因此,扫描哪些表分区,不扫描哪些表分区与使用什么类型的局部索引没有关系,只与表分区机制相关。
        那么,什么情况使用局部前缀索引,什么情况使用局部非前缀索引呢?这个主要看你主要进行什么样的查询。比如:你主要会进行如下查询:select ... from partitioned_table where a = :a and b = :b; 那么在(a,b)列上建立一个局部前缀索引很合适。如果除开上面那个查询很频繁,下面这个查询也很频繁:select ... from partitioned_table where b = :b;那么在(b,a)上建立一个非前缀索引很合适。
   www.2cto.com  
       三. 全局索引
       与局部索引不同,全局索引只有一类,前缀全局索引。也就是全局索引的索引键应该从索引的分区键开始,无论用什么属性对索引分区,这些属性必须是索引键的前几列。比如:
 
Sql代码  
CREATE TABLE partitioned ( timestamp date, id int )   
PARTITION BY RANGE (timestamp)   
( PARTITION part_1 VALUES LESS THAN ( to_date('01-jan-2000','dd-mon-yyyy') ) ,   
PARTITION part_2 VALUES LESS THAN ( to_date('01-jan-2001','dd-mon-yyyy') ) )   
 
     创建分区表,以timestamp列分区,接着运行如下SQL语句建立一个全局索引
 
Sql代码  
create index partitioned_index on partitioned(id)   
GLOBAL   
partition by range(id)   
( partition part_1 values less than(1000),   
partition part_2 values less than (MAXVALUE) )   
  www.2cto.com  
       这个全局索引的索引键是id,索引的分区键是id。如果索引键指定为(timestamp,id)就会报错。
      那么什么情况下使用局部索引,什么情况使用全局索引。这还是要看你需要查找什么样的数据。假如一个客户信息表,是按照客户的注册时间(regist_time)进行表分区的。如果我们要查找注册时间从date1到date2中姓王的所有客户信息,这个时候适合在客户名称(name)上建立一个局部索引。因为我们很可能只要查找一个表分区或者几个表分区,而不是所有的表分区都要扫描。但是,如果我们要查找的是某某地区姓王的客户信息。这个明显要扫描所有表分区,那么要建立一个全局索引在地区字段和姓名字段上。
 

推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
别来无恙hia
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有