分区
创建分区
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 "%_" 百分号在前.