分区与索引

分区

创建分区

Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区

1.      范围分区

就是根据数据库表中某一字段的值的范围来划分分区。

partition by range(grade)  

(  

  partition bujige values lessthan(60), --不及格  

  partition jige values lessthan(85), --及格  

  partition youxiu values lessthan(maxvalue) --优秀  

按照值范围动态创建分区

partition by range(grade) INTERVAL(范围值)

2.      散列分区

散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等。

partition by hash(sno)  

(  

 partition p1,  

 partition p2,  

 partition p3  

);

3.      列表分区

列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。

partition by list(dormitory)  

(  

  partition d229values('229'),  

  partition d228values('228'),  

  partition d240values('240')  

4.      复合分区

有范围-散列分区,范围-列表分区。

范围-散列分区时列表分区不支持多列,但是范围分区和哈希分区支持多列。

partition byrange(grade)  

subpartition byhash(sno,sname)  

(  

  partition p1 values less than(75)  

            (  

               subpartition sp1,subpartitionsp2  

            ),  

  partition p2 values less than(maxvalue)  

            (  

               subpartition sp3,subpartitionsp4  

            )  

);

范围-列表分区有两种创立方式,没有模板的创建方式和有模板的创建方式。

分区操作

1)查询分区

查询数据时,可以查询指定分区上的数据:

select * from table_name partition(分区名称)

select * from table_name subpartition(分区名称)

2)分裂分区

把1个分区分成2个分区
alter table table_name split partition
原分区名称 at(分区范围值)   
      into(partition 新分区名称1,partition 新分区名称2);

3)合并分区

把2个分区合并成1个分区

alter table table_namemerge partitions 原分区名称1,原分区名称2   

into partition 新分区名称

4)添加分区

alter  table table_name add partition 分区名称

5)删除分区

alter tabletable_name drop partition partition_name;

6)清空分区数据

alter table table_name truncate partition partition_name

索引

索引优点与缺点

优点:

1)  创建唯一索引可以保证每行数据的唯一性

2)  可以加快数据检索速度;

3)  加速表与表之间的连接;

缺点:

1)  创建索引和维护索引需要耗费时间,数据量大耗费的时间增加;

2)  索引需要占物理空间;

3)  表中数据删除,增加,修改时,索引也需要动态维护;

什么情况下适合建索引

1)  经常需要搜索的列,加上索引可以提供速度;

2)  作为主键的列,创建唯一索引;

3)  在经常用作连接的列上,这些列主要是一些外键,可以提高连接速度;

4)  在需要根据范围进行搜索的列上;

5)  在需要经常排序的列上;

6)  在经常使用在where字句中的列上;

创建索引

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>

      ON <schema>.<table_name>

           (<column_name> | <expression> ASC | DESC,
            <column_name> | <expression> ASC | DESC,...)
     TABLESPACE <tablespace_name>
     STORAGE <storage_settings>
     LOGGING | NOLOGGING
    COMPUTE STATISTICS
     NOCOMPRESS | COMPRESS<nn>
     NOSORT | REVERSE
    PARTITION | GLOBAL PARTITION<partition_setting>

唯一索引:可以保证每行数据的唯一性

索引

1.      索引失效的情况

1)   没有查询条件,或者查询条件没有建立索引 
2)
在查询条件上没有使用引导列 
3)
查询的数量是大表的大部分,应该是30%以上。 
4)
索引本身失效 
5)
查询条件使用函数在索引列上(见12 
6)
对小表查询 
7)
提示不使用索引 
8)
统计数据不真实 
9) CBO
计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。 
10)
隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20), 
但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效

11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+-*/!
错误的例子:select * fromtest where id-1=9; 
正确的例子:select * fromtest where id=10; 
12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引
错误的例子:select * fromtest where round(id)=10; 
说明,此时id的索引已经不起作用了正确的例子:首先建立函数索引, 
create index test_id_fbi_idx on test(round(id)); 

然后 select * fromtest where round(id)=10; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会
13)like "%_" 百分号在前


猜你喜欢

转载自blog.csdn.net/wli_2005/article/details/80982616