`

oracle 索引和表分区

 
阅读更多

索引

 

并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读,
当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。以下例子

drop table mytest;
create table mytest(
       id varchar(10),
       name varchar(10)
);
--创建name索引
create index mytest_id on mytest(name);

insert into mytest values ('1','1');
insert into mytest values ('2','2');
insert into mytest values ('3','3');

--走索引
select count(*) from mytest ;
--索引有效,但不走,因为不走索引的速度比走索引快  解释计划得到耗费3
select * from mytest where name='2';
--强制走索引  解释计划得到耗费268
select /*+ index(mytest mytest_id) */  * from mytest where name='2';
--索引无效
select * from mytest where substr(name,0,1)='1';
--索引无效
select * from mytest where name is not null;

 

1.6 限制索引
限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
   1.6.1  使用不等于操作符(<>!=      
   下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。     
   select cust_Id,cust_name from customers where  cust_rating <> 'aa';        
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。        
  select cust_Id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa';
  特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
   1.6.使用IS NULL IS NOT NULL
   使用IS NULL IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。
   1.6.3 使用函数
   如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 下面的查询不会使用索引(只要它不是基于函数的索引)
 select empno,ename,deptno from emp  where  trunc(hiredate)='01-MAY-81';
   把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptno from emp where  hiredate<(to_date('01-MAY-81')+0.9999);

 

  1.6.4 比较不匹配的数据类型       
也是比较难于发现的性能问题之一。 注意下面查询的例子,account_number是一个VARCHAR2类型,account_number字段上有索引。

 

下面的语句将执行全表扫描

 

 select bank_name,address,city,state,zip from banks where account_number = 990354;
 Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:
 select bank_name,address,city,state,zip from banks where account_number ='990354';

 

特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次全表扫描

 

参考文献

http://blog.csdn.net/tianlesoftware/article/details/5347098

 

表分区

 创建分区

 

 

--范围分区
CREATE TABLE T_NEW (
   ID NUMBER PRIMARY KEY,
   TIME DATE
) 
PARTITION BY RANGE (TIME)
(
 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
 PARTITION P4 VALUES LESS THAN (MAXVALUE)
); 

 

--列表分区
CREATE  TABLE  ListTable
(
    id    INT  PRIMARY  KEY ,
    name  VARCHAR (20),
    area  VARCHAR (10)
)
PARTITION  BY  LIST (area)
(
    PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,
    PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb
);

 

--hash分区
drop table mytest;
create table mytest(
       id varchar(10),
       name varchar(10) not null
)
partition by hash(name)(
       partition mytest01,
       partition mytest02,
       partition mytest03
)

insert into mytest values ('1','1');
insert into mytest values ('2','2');
insert into mytest values ('3','3');
--查询整表
select * from mytest 
--查询分区
select * from mytest partition(mytest03)

 

二、删除分区
以下代码删除了P3表分区:
ALTER TABLE SALES DROP PARTITION P3;
在以下代码删除了P4SUB1子分区:
ALTER TABLE SALES DROP SUBPARTITION P4SUB1;

 

截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
ALTER TABLE SALES TRUNCATE PARTITION P2;
通过以下代码截断子分区:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
 

合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:

ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。

ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
重命名表分区
以下代码将P21更改为P2
ALTER TABLE SALES RENAME PARTITION P21 TO P2;
--显示数据库所有分区表的信息:
select * from DBA_PART_TABLES
--显示当前用户可访问的所有分区表信息:
select * from ALL_PART_TABLES
--显示当前用户所有分区表的子分区列信息:
select * from USER_SUBPART_KEY_COLUMNS
--怎样查询出oracle数据库中所有的的分区表
select * from user_tables a where a.partitioned='YES'
--删除分区表一个分区的数据是
alter table table_name truncate partition p5;

参考文献

http://tianzt.blog.51cto.com/459544/171759/

分享到:
评论

相关推荐

    oracle索引和表分区

    oracle索引和表分区,oracle索引,oracle表分区

    oracle索引与分区索引介绍

    Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建方法、维护操作等方面的知识...

    Oracle分区表及分区索引

    Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...

    Oracle分区表和分区索引在VLDB中的研究.pdf

    然后,讨论了Oracle分区表的类型,包括范围分区(Range)、散列分区(Hash)、列表分区(List)、组合分区(Subpartition)、Interval分区和引用分区(Reference)。每种类型的分区都有其特点和应用场景。 在 VLDB ...

    Oracle 分区表 分区索引

    - **增加索引分区**:当添加新表分区时,可能需要相应地添加索引分区。 - **删除索引分区**:当删除表分区时,可能需要删除相应的索引分区。 - **重编译索引分区**:当索引分区损坏或需要更新统计信息时,需要重新...

    分区索引,本地索引,全局索引的区别

    - **分区消除**:前缀和非前缀索引都支持索引分区消除,但前提是查询条件中需包含索引分区键。 - **唯一性约束**:本地索引只支持分区内的唯一性,如果要在表上设置唯一性约束,必须包含分区键列。 - **可用性**:...

    oracle分区表分区索引.docx

    对于本地索引,其索引分区的维护自动进行,就是说你 add/drop/split/truncate 表的分区时,本地索引会自动维护其索引分区。 三、创建分区表和分区索引 创建分区表可以使用以下语句: ```sql CREATE TABLE GW_...

    Oracle 分区表 分区索引 索引分区详解

    虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

    ORACLE分区与索引

    总的来说,Oracle 分区和索引是优化大数据查询的关键工具,它们通过有效的数据组织和快速的数据访问路径,提升了系统的整体性能和可维护性。在设计时,应考虑数据的特性、查询模式以及系统资源,以制定最佳的分区和...

    oracle自动建立表分区脚本

    Oracle支持多种分区类型,包括范围分区、列表分区、散列分区和复合分区等。 2. **范围分区**:根据指定的列值范围划分分区,例如按照日期创建月度或季度分区。这种分区方式适用于历史数据归档,便于按时间区间查询...

    oracle普通表转化为分区表的方法

    Oracle数据库中的分区表是一种高级的表组织形式,它将大表分成多个较小的部分,每个部分称为一个分区,以提高查询性能和管理效率。当表的大小超过2GB时,官方推荐使用分区表,因为它们在处理大量数据时具有显著优势...

    深入学习分区表及分区索引(详解oracle分区).docx

    - 物理属性可以不同,如PCTFREE(预留空间百分比)、PCTUSED(使用空间百分比)和表空间分配。 - 分区独立性保证即使部分分区不可用,其他分区仍可正常工作。 - 最大分区数量为64000,但LONG或LONG RAW列的表不...

    Oracle锁和表分区

    Oracle数据库系统中,锁和表分区是两个关键的管理数据并发和优化性能的机制。首先,我们来深入了解锁的概念。 1. **锁定机制**:锁定是数据库管理系统中用于控制并发访问的一种方法,确保多用户环境下的数据完整性...

    ORACLE表自动按月分区步骤

    完成分区和索引的创建后,需要将之前备份的数据恢复到新创建的分区表中。这一步骤可以通过简单的INSERT INTO...SELECT FROM语句实现: ```sql INSERT INTO USER_ORDER SELECT * FROM USER_ORDER_DATA; ``` #### 六...

    Oracle分区表详解

    Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能、可用性和可维护性。 ##### 分区的作用: 1. **...

    深入oracle分区索引的详解

    表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部...5.前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。6.局部

Global site tag (gtag.js) - Google Analytics