- 浏览: 455786 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- gef (1)
- emf (0)
- rcp (2)
- 杂谈 (3)
- draw2d (2)
- xml (1)
- spring (16)
- osgi (1)
- jsp (6)
- hibernate (8)
- j2se (41)
- oracle (25)
- js (23)
- ognl (1)
- struts2 (2)
- webwork (1)
- prototype (1)
- dwr (3)
- struts (7)
- axis2 (3)
- axis1 (6)
- lucene (9)
- pop3 (1)
- aspectj (1)
- 网络协议 (6)
- bat (6)
- Quartz (5)
- jms (3)
- jndi (7)
- 网络爬虫 (7)
- acegi (1)
- linux (5)
- 缓存 (1)
- mysql (1)
- 在使用Java处理图形应用时,经常有人推荐设置 -Djava.awt.headless=true,具体含义和效果查了一下,记录在这里分享 Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。 Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主 (1)
最新评论
-
hanmiao:
注释掉的那壹行少了壹個斜线,楼主...
servlet导出excel -
天下无贼:
Thread.Interrupt方法,只是通过扔出异常的方式, ...
Java Thread.interrupt 害人! 中断JAVA线程(zz) -
天下无贼:
呵呵,是你自己写错了。
Java Thread.interrupt 害人! 中断JAVA线程(zz) -
MO_ZHUANG_D:
如果是真的就感激不尽了
Axure RP教程 -
小嘴冰凉:
在开始执行的时候,如果是数据库存储,程序会从数据库中查job信 ...
quartz的持久化
Oracle reverse函数
2007-10-25 14:06
reverse函数功能就是反向排列给定的数组元素
SQL> create or replace function Re(s string) return varchar2 is
Result varchar2(1000);
v_s string(1000);
begin
for i in 1..length(s)
loop
Result:=Result||substr(s,length(s)-i+1,1);
end loop;
return(Result);
end Re;
1.3.3 索引
Oracle 9i中有6种可以使用的索引:B-Tree索引(不指定任何选项的创建方法所创建)、压缩B树索引、Bitmap(位图)索引、基于函数的索引、 Reverse Key Index(RKI,反向键索引)、Index Organized Table(IOT,索引组织表)。
1.3.3.1 检查索引信息
dba_indexes
index_type (normal-B树,normal/rev-反向键,function-based normal,bitmap,iot-top,cluster,lob)
compression
funcidx_status
dba_segments
segment_name
segment_type
tablespace_name
dba_tables
SQL> select table_name,iot_name,iot_type,tablespace_name from dba_tables where iot_type is not null;
就可以观察出IOT益出的情况。 Tablespace_name 为空,说明为一个索引而不是一个表。
监视索引使用情况
如果一个索引永远得不到,应该删除:
1)消除了对被索引表DML操作时的索引维护系统开销。
2)释放表空间。
执行SQL>alter index c_unicom.idx_ne_cell monitoring usage;
一段时间后执行SQL> alter index unicom.idx_ne_cell nomonitoring usage;
此时查询v$object_usage(Oracle 9i)的used列,YES表示监视期间至少得到过一次访问。NO表示未得到访问。
1.3.3.2 B-Tree索引
基础概念
也叫平衡树索引。
是按升序对被索引的列进行排序,同时存储一个行ID,用来指出该行的其他数据的物理存储地,Oracle以一种树型结构来存储这些数。
查询时,首先搜索该多级树结构形式组织的索引,然后按ID访问需要的表数据。
1)如果表数据行很多,只返回一个表中的少数行(Oracle建议是5%)。
2)具有高基数的列。且这些列经常被用在where条件中。
此时Oracle建议创建一个B树索引。
如:Create index idx_ne_cell on ne_cell(ne_id) tablespace unicom_dbs;
判断是否需要重建索引
B树索引设计为总是平衡的,Oracle随着insert操作而连续的分裂索引块,但是,随着insert和delete操作,该索引会产生许多级,增加索引从根遍历的时间,降低了效率,此时需要重建索引。
Oracle建议:
1)当级别深度到4或超过4时。(增加了从根遍历的时间)
索引被分析后,执行select index_name,blevel from dba_indexes where blevel >=4;检查
2)被删除数占总数的20%以上时。(增加了访问某项所访问的index块数)
- 执行analyze index idx_ne_cell validate structure;填充表index_stats数据。
- 执行select (del_lf_rows_len/lf_rows_len)*100 “Wasted Space”
from index_stats where name=’IDX_NE_CELL’;
Column Description
LF_ROWS Number of values currently in the index
LF_ROWS_LEN Sum in bytes of the length of all values
DEL_LF_ROWS Number of values deleted from the index
DEL_LF_ROWS_LEN Length of all deleted values
重建索引
在一个不稳定的表上建索引会影响性能,一个索引block只有完全空时才能进入free list,即使一个索引block里只含有一个条目,它也必须被维护,因此索引需要进行阶段性的重建。
- 删除该index并执行create index ...开始创建。
是最耗时的方法,也是资源密集型。但7.3前版本只能这么做。
- alter index .. rebuild tablespace ..;
使用现有索引项来重建索引,很快。同时能把索引转移到其他表空间。但创建的过程中,新旧索引同时存在,要求有额外的临时空间可用。
SQL>alter index idx_ne_cell rebuild online;
使用online来尽可能减少创建过程中出现的任何加锁问题。
- alter index .. coalesce;
只是将处于同一个索引分支内的叶块拼合起来,很快,不要求额外的磁盘空间,最大限度的减少了创建过程中出现的任何加锁问题。但此方法不能转移索引到另外一个表空间。
更多关于alter index 参考 9.0.1 A901177-01的16章。
1.3.3.3 压缩B树索引
如果B树索引非常大,此时就建议使用压缩B树索引了。
压缩B树索引:在索引列存在重复值时,只记录一个值和不同的row id,减少了重复的列值的存储(同理,基数非常大或列值都唯一的,压缩就没多少必要了)。最大限度的减少了B树索引占用的磁盘空间。同时索引扫描也会访问更少的数据库块,减少I/O。
压缩语句:
SQL>create index idx_alarminfo on alarminfo(ALARMOBJECT) tablespace unicom_dbs compress;
或:
SQL>alter index idx_alarminfo rebuild compress;
1.3.3.4 Bitmap(位图)索引
创建表行的一个二进制映像,比如是存储1,不是存储0。所以占用更少的存储空间。
1)位图索引检索、匹配的行会更快。
2)对于底基数列,工作的更好。(高基数,B树好)
3)被索引表要DML操作少、长度大、有极少不同值的表列上极有用。(DML操作会引起位图级的加锁发生,而且要求重建所有可能值的整个位图;即使发生很多行被操作,但只按一次DML进行更新)
4)适合在决策支持系统或数据仓库使用。
SQL>create bitmap index idx_ne_cell on ne_cell(related_bsc);
//加大sort_area_size和pga_aggregate_target通常会加快bitmap index的创建和操作。
1.3.3.5 基于函数的索引
函数索引适用于B树索引和bitmap索引。但必须把init.ora的query_rewrite_enabled参数设置成true才可使用。(默认是false)
在SQL语句的WHERE字句中有任一函数或操作被运用于一个索引列时,执行计划将使用全表扫描而不会使用非函数索引。
如:select last_name,first_name from employee
where upper(first_name) = ‘REGINALD’;
或:select product_id,units,price,price*units from sales
where (price*units) > 10000;
都不会使用first_name或price或units列上的索引。
如下创建函数索引后优化程序才会考虑使用索引:
SQL>create index idx_first_name_employee on employee (upper(first_name));
SQL>create index idx_sales_total on sales (price*units) tablespace ind_dbs;
1.3.3.6 Reverse Key Index
属于B树索引。
RKI:首先反向每个列键值的字节(如123,就被反为321,新数值在范围上,比原来那些列值会分布的更均匀),然后在反向后的数据上进行索引。
非常适用于含有序数的列。(因传统的B树,此时往往会产生很多级,而超过4级性能就会很低)
注意:RKI只能用于等于、不等于判断。其他如>、<、between等会导致无法使用该索引,可能会导致全表扫描。
SQL>create index idx_employee_iem_id on employee(emp_id)
Reverse
Tablespace idx_dbs;
或
SQL>alter index idx_employee_iem_id rebuild reverse;
1.3.3.7 Index Organized Table
B树、位图、反向等索引,直接指向索引基础表中对应数据行的ID,这是因为表行以一种或多或少的随机方式被分配给表内的块,因Oracle在存储行时,并不考虑行的内容。是一种堆叠方式存储的数据,叫Heap Table(堆表)。
如果希望按一种指定顺序来存储一个表数据,就要使用IOT(索引组织表)。此时把行数据全部存储在索引本身内。
好处:
1)表行按索引顺序存储。若用主键来访问表,IOT比传统表更快。
2)使用B树时,只需要读取索引,不需要读取表,减少了一次I/O。
注意:
1)IOT在将要做索引基础的那一列上必须有一个主键约束。
2)IOT不能含有唯一性约束,或被cluster。
SQL>create table employee_history
(employee_id number primary key,
last_name varchar2(20),
first_name varchar2(20),
title varchar2(30),
hire_date date,
departure_date date)
ORGANIZATION INDEX TABLESPACE idx_dbs --指定表为IOT
PCTTHRESHOLD 25 --指定真个数据块保持打开的百分比,必须在0-50之间
INCLUDEING first_name --指定行超过PCTTHRESHOLD时,按那一列把行分解成两段
OVERFLOW TABLESPACE app_of – 指定分解的行的一半存储的表空间
MAPPING TABLE; -- 在创建IOT上的位图所有时所必须的一个关联映像表的创建
位图索引可以以堆表(此时以行ID关联数据行)或IOT(利用映像表来定位被索引的IOT行)做为基础表。
映像表:把索引的物理行ID映像到索引组织表的对应的逻辑行ID,每个IOT只有一个。
物理行ID会随着数据的insert和delete而发生变化(因为排序了,IOT叶会在它们变满时像B树索引一样发生分裂;如果没有映像表记录逻辑ID,这种物理分裂会使相关位图索引不能使用)。
随着时间的推移,bitmap index可能会和IOT不一致,查找不一致范围:
SQL> select owner,index_name,pct_direct_access from dba_indexes
where pct_direct_access is not null;
Oracle建议,超过30%的bitmap index应该rebuild。
1.3.4 分区partition
分区:将表数据划分成更小的子集。
好处:
1)提高可用性。
如100GB的表,如果划分成2G的50个分区,只要当前查询的数据所处的分区online,而其他的分取offline,数据库依然工作正常。
2)减轻管理负担。
对分区数据的维护,比如删除、更新、分析、数据恢复等,可以以分区为单位进行维护。
3)提高DML和查询操作性能。
利用CBO的分区排除机制,跳过未含有相关数据的表分区,减少I/O。
分区表使用CBO,CBO具有很好的“分区意识能力”,直接排除不属于查询结果的分区。(分区键列上同样不能应用函数,否则不会使用索引)
对于分区的表,应尽可能的利用分区键作为查询条件,不然会执行full table scan,会比不分区的全表扫描花费更多的时间,失去分区的意义。
分区信息可查询:select * from user_tab_partitions;
(比如小区表,可以按小时分区,小时里再按hash分区防止分区不均匀,此时再对各分区进行truncate等维护,就快了)
1.3.4.1 创建分区
分区可分为如下几种:(范围分区,hash分区,列表分区,范围-hash分区,范围-列表分区(oracle 9i relase 2以后才提供))
范围分区
使用列值的范围来确定一个数据行被插入到那个分区中。
1)分区键最多可16列,一个表最多可65636个分区。
2)分区范围中不能有任何空隙。
3)每个分区中,等于上限的值都是存储在上一个分区中的。
4)less then子句指定的值,必须是一个用RPAD函数填充过的值、日期(必须包含世纪)或常数。
5)分区表不能包含带有long,long raw的数据列。
6)试图插入一个无法放入任一分区的数据,都导致ORA-14400错误。
7)通过更新数据使数据在分区间移动不被允许,除非创建表的时候指定了enable row movement子局。
如果插入的数据导致分区不均匀,应考虑使用散列分区。
SQL>create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY RANGE (graduation_date)
(PARTION p_2000 VALUES LESS THEN
(to_date(‘2000-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab01,
PARTION p_2001 VALUES LESS THEN
(to_date(‘2001-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab02,
PARTION p_error VALUES LESS THEN
(MAXVALUE) TABLESPACE hist_tab03
);
SQL> select * from student_history (p_2000);
列表分区
类似范围分区,区别是它基于一组指定的值。范围分区是基于一个范围。
试图插入一个无法放入任一分区的数据,都导致ORA-14400错误。
SQL>create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY LIST (degree)
(PARTION p_undergrad VALUES (‘BS’,’BA’,’BBA’,’BFA’)
TABLESPACE hist_tab01,
PARTION p_graduate VALUES (‘MA’,’MBA’,’MFA’,’MS’)
TABLESPACE hist_tab02,
PARTION p_doctorate VALUES (‘PHD’)
TABLESPACE hist_tab03
);
散列分区
使用一个散列算法来分配数据被插入到那个分区中。一般分配很均匀,对于序数的列很适合。
1)分区键应具有很高基数。
2)如果是唯一键分区,效果最好。如果是范围查找,不会有性能提升。
3)通过更新数据使数据在分区间移动不被允许。
4)总分区数,应该是2的整数倍。
SQL> create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY HASH (student_id)
PARTITION 3
STORE IN (hist_tab01, hist_tab02, hist_tab03);
drop table part_ALARMTEXTDATA;
create table part_ALARMTEXTDATA
( ALARMNUMBER VARCHAR2(16) NOT NULL ,
ALARMTEXT VARCHAR2(255) NOT NULL ,
SERIAL NUMBER(38) NOT NULL)
PARTITION BY HASH (ALARMNUMBER)
(part_ALARMTEXTDATA_01 tablespace hxj_partion01,
part_ALARMTEXTDATA_02 tablespace hxj_partion02,
part_ALARMTEXTDATA_03 tablespace hxj_partion03,
part_ALARMTEXTDATA_04 tablespace hxj_partion04);
组合分区
创建范围分区,在该分区内又再创建散列分区。(一般用在需要范围分区,而范围分区又不均匀的情况下)
1)分区是逻辑结构,表数据被存储在子分区级上。
2)组合分区对:分区级的、历史的、日期的,查询十分好使。
3)组合分区对子分区级的并行操作也十分有用。
4)分区级的连接操作通过使用组合的局部索引支持。
SQL> create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY RANGE (graduation_date)
SUBPARTITION BY HASH (student_id)
SUBPARTITIONS 2
STORE IN (hist_tab01, hist_tab02)
(
PARTION p_2000 VALUES LESS THEN
(to_date(‘2000-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab01,
PARTION p_2001 VALUES LESS THEN
(to_date(‘2001-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab02,
PARTION p_error VALUES LESS THEN
(MAXVALUE) TABLESPACE hist_tab03
);
1.3.4.2 索引分区
唯一所以必须是全局的。
分两类,全局与局部索引,前缀与非前缀索引。
全局与局部索引:与该索引的分区结构是否与被索引基础表结构匹配有关系。
局部索引:索引中的分区与基础表的分区逐个匹配。
- 可以人任何分区上创建局部分区索引。
- 创建后,Oracle自动维护表分区与索引分区之间的关系。
- 分区上的位图索引必须是局部的索引。
SQL> create index dinya_idx_t on dinya_test(item_id)
local
(
partition idx_1 tablespace dinya_space01,
partition idx_2 tablespace dinya_space02,
partition idx_3 tablespace dinya_space03
);
Index created.
SQL>
全局索引:索引中的分区与基础表的分区数不逐个匹配。
- 可以人任何分区上创建全局分区索引,但它自身必须是范围的。
- 最高分区必须以MAXVALUE参数来定义。
- 对分区表的维护操作(drop ,truncate操作等),会导致全局索引无效。此时必须重建。
- 使用global创建与表分区一样多的索引,Oracle也不会认为是局部索引。
SQL> create index dinya_idx_t on dinya_test(item_id)
global partition by range(item_id)
(
partition idx_1 values less than (1000) tablespace dinya_space01,
partition idx_2 values less than (10000) tablespace dinya_space02,
partition idx_3 values less than (maxvalue) tablespace dinya_space03
);
Index created.
global 子句允许指定索引的范围值,这个范围值为索引字段的范围值.
SQL>
或
SQL> create index dinya_idx_t on dinya_test(item_id);
Index created.
SQL>
前缀与非前缀索引:与该索引是否有分区键及分区键出现在索引结构内的位置有关系。
前缀索引:索引的最左列与分区键相同。可以是唯一的,也可以不是唯一的。
前缀局部索引:
SQL>create index student_history_lp_idx on student_history (graduation_date) local;
此时默认与基础表分区数一样。以graduation_date范围分区。
前缀全局索引:
略。
非前缀索引:索引的最左列与分区键不相同。可以是唯一的(唯一时分区键必须是索引的子集),也可以不是唯一的。
非前缀局部索引:
SQL>create index student_history_lp_idx on student_history (graduation_date) local;
此时默认与基础表分区数一样。以graduation_date范围分区。
非前缀全局索引:
略。
分区索引不能作为整体一次重建。
alter index local2_alarminfo rebuild partition l_ind2_alarminfo_050915;
1.3.4.3 管理分区
1.1.1.1.1 收集分区的统计数据
可以针对段、分区或子分区级上收集。
例(收集分区表和分区索引):
SQL>execute dbms_stats.gather_table_stats(ownname=>’APPS’,tabname=>’STUDENT_HISTORY’,partname=>’P_1998’,granularity=>’PARTITION’);
SQL>execute dbms_stats.gather_index_stats(ownname=>’SYS’,indname=>’STUDENT_HISTORY_GP_IDX’,partname=>’P_200n’);
http://hi.baidu.com/zting0103/blog/item/0b42b029885097fd98250a63.html
2007-10-25 14:06
reverse函数功能就是反向排列给定的数组元素
SQL> create or replace function Re(s string) return varchar2 is
Result varchar2(1000);
v_s string(1000);
begin
for i in 1..length(s)
loop
Result:=Result||substr(s,length(s)-i+1,1);
end loop;
return(Result);
end Re;
1.3.3 索引
Oracle 9i中有6种可以使用的索引:B-Tree索引(不指定任何选项的创建方法所创建)、压缩B树索引、Bitmap(位图)索引、基于函数的索引、 Reverse Key Index(RKI,反向键索引)、Index Organized Table(IOT,索引组织表)。
1.3.3.1 检查索引信息
dba_indexes
index_type (normal-B树,normal/rev-反向键,function-based normal,bitmap,iot-top,cluster,lob)
compression
funcidx_status
dba_segments
segment_name
segment_type
tablespace_name
dba_tables
SQL> select table_name,iot_name,iot_type,tablespace_name from dba_tables where iot_type is not null;
就可以观察出IOT益出的情况。 Tablespace_name 为空,说明为一个索引而不是一个表。
监视索引使用情况
如果一个索引永远得不到,应该删除:
1)消除了对被索引表DML操作时的索引维护系统开销。
2)释放表空间。
执行SQL>alter index c_unicom.idx_ne_cell monitoring usage;
一段时间后执行SQL> alter index unicom.idx_ne_cell nomonitoring usage;
此时查询v$object_usage(Oracle 9i)的used列,YES表示监视期间至少得到过一次访问。NO表示未得到访问。
1.3.3.2 B-Tree索引
基础概念
也叫平衡树索引。
是按升序对被索引的列进行排序,同时存储一个行ID,用来指出该行的其他数据的物理存储地,Oracle以一种树型结构来存储这些数。
查询时,首先搜索该多级树结构形式组织的索引,然后按ID访问需要的表数据。
1)如果表数据行很多,只返回一个表中的少数行(Oracle建议是5%)。
2)具有高基数的列。且这些列经常被用在where条件中。
此时Oracle建议创建一个B树索引。
如:Create index idx_ne_cell on ne_cell(ne_id) tablespace unicom_dbs;
判断是否需要重建索引
B树索引设计为总是平衡的,Oracle随着insert操作而连续的分裂索引块,但是,随着insert和delete操作,该索引会产生许多级,增加索引从根遍历的时间,降低了效率,此时需要重建索引。
Oracle建议:
1)当级别深度到4或超过4时。(增加了从根遍历的时间)
索引被分析后,执行select index_name,blevel from dba_indexes where blevel >=4;检查
2)被删除数占总数的20%以上时。(增加了访问某项所访问的index块数)
- 执行analyze index idx_ne_cell validate structure;填充表index_stats数据。
- 执行select (del_lf_rows_len/lf_rows_len)*100 “Wasted Space”
from index_stats where name=’IDX_NE_CELL’;
Column Description
LF_ROWS Number of values currently in the index
LF_ROWS_LEN Sum in bytes of the length of all values
DEL_LF_ROWS Number of values deleted from the index
DEL_LF_ROWS_LEN Length of all deleted values
重建索引
在一个不稳定的表上建索引会影响性能,一个索引block只有完全空时才能进入free list,即使一个索引block里只含有一个条目,它也必须被维护,因此索引需要进行阶段性的重建。
- 删除该index并执行create index ...开始创建。
是最耗时的方法,也是资源密集型。但7.3前版本只能这么做。
- alter index .. rebuild tablespace ..;
使用现有索引项来重建索引,很快。同时能把索引转移到其他表空间。但创建的过程中,新旧索引同时存在,要求有额外的临时空间可用。
SQL>alter index idx_ne_cell rebuild online;
使用online来尽可能减少创建过程中出现的任何加锁问题。
- alter index .. coalesce;
只是将处于同一个索引分支内的叶块拼合起来,很快,不要求额外的磁盘空间,最大限度的减少了创建过程中出现的任何加锁问题。但此方法不能转移索引到另外一个表空间。
更多关于alter index 参考 9.0.1 A901177-01的16章。
1.3.3.3 压缩B树索引
如果B树索引非常大,此时就建议使用压缩B树索引了。
压缩B树索引:在索引列存在重复值时,只记录一个值和不同的row id,减少了重复的列值的存储(同理,基数非常大或列值都唯一的,压缩就没多少必要了)。最大限度的减少了B树索引占用的磁盘空间。同时索引扫描也会访问更少的数据库块,减少I/O。
压缩语句:
SQL>create index idx_alarminfo on alarminfo(ALARMOBJECT) tablespace unicom_dbs compress;
或:
SQL>alter index idx_alarminfo rebuild compress;
1.3.3.4 Bitmap(位图)索引
创建表行的一个二进制映像,比如是存储1,不是存储0。所以占用更少的存储空间。
1)位图索引检索、匹配的行会更快。
2)对于底基数列,工作的更好。(高基数,B树好)
3)被索引表要DML操作少、长度大、有极少不同值的表列上极有用。(DML操作会引起位图级的加锁发生,而且要求重建所有可能值的整个位图;即使发生很多行被操作,但只按一次DML进行更新)
4)适合在决策支持系统或数据仓库使用。
SQL>create bitmap index idx_ne_cell on ne_cell(related_bsc);
//加大sort_area_size和pga_aggregate_target通常会加快bitmap index的创建和操作。
1.3.3.5 基于函数的索引
函数索引适用于B树索引和bitmap索引。但必须把init.ora的query_rewrite_enabled参数设置成true才可使用。(默认是false)
在SQL语句的WHERE字句中有任一函数或操作被运用于一个索引列时,执行计划将使用全表扫描而不会使用非函数索引。
如:select last_name,first_name from employee
where upper(first_name) = ‘REGINALD’;
或:select product_id,units,price,price*units from sales
where (price*units) > 10000;
都不会使用first_name或price或units列上的索引。
如下创建函数索引后优化程序才会考虑使用索引:
SQL>create index idx_first_name_employee on employee (upper(first_name));
SQL>create index idx_sales_total on sales (price*units) tablespace ind_dbs;
1.3.3.6 Reverse Key Index
属于B树索引。
RKI:首先反向每个列键值的字节(如123,就被反为321,新数值在范围上,比原来那些列值会分布的更均匀),然后在反向后的数据上进行索引。
非常适用于含有序数的列。(因传统的B树,此时往往会产生很多级,而超过4级性能就会很低)
注意:RKI只能用于等于、不等于判断。其他如>、<、between等会导致无法使用该索引,可能会导致全表扫描。
SQL>create index idx_employee_iem_id on employee(emp_id)
Reverse
Tablespace idx_dbs;
或
SQL>alter index idx_employee_iem_id rebuild reverse;
1.3.3.7 Index Organized Table
B树、位图、反向等索引,直接指向索引基础表中对应数据行的ID,这是因为表行以一种或多或少的随机方式被分配给表内的块,因Oracle在存储行时,并不考虑行的内容。是一种堆叠方式存储的数据,叫Heap Table(堆表)。
如果希望按一种指定顺序来存储一个表数据,就要使用IOT(索引组织表)。此时把行数据全部存储在索引本身内。
好处:
1)表行按索引顺序存储。若用主键来访问表,IOT比传统表更快。
2)使用B树时,只需要读取索引,不需要读取表,减少了一次I/O。
注意:
1)IOT在将要做索引基础的那一列上必须有一个主键约束。
2)IOT不能含有唯一性约束,或被cluster。
SQL>create table employee_history
(employee_id number primary key,
last_name varchar2(20),
first_name varchar2(20),
title varchar2(30),
hire_date date,
departure_date date)
ORGANIZATION INDEX TABLESPACE idx_dbs --指定表为IOT
PCTTHRESHOLD 25 --指定真个数据块保持打开的百分比,必须在0-50之间
INCLUDEING first_name --指定行超过PCTTHRESHOLD时,按那一列把行分解成两段
OVERFLOW TABLESPACE app_of – 指定分解的行的一半存储的表空间
MAPPING TABLE; -- 在创建IOT上的位图所有时所必须的一个关联映像表的创建
位图索引可以以堆表(此时以行ID关联数据行)或IOT(利用映像表来定位被索引的IOT行)做为基础表。
映像表:把索引的物理行ID映像到索引组织表的对应的逻辑行ID,每个IOT只有一个。
物理行ID会随着数据的insert和delete而发生变化(因为排序了,IOT叶会在它们变满时像B树索引一样发生分裂;如果没有映像表记录逻辑ID,这种物理分裂会使相关位图索引不能使用)。
随着时间的推移,bitmap index可能会和IOT不一致,查找不一致范围:
SQL> select owner,index_name,pct_direct_access from dba_indexes
where pct_direct_access is not null;
Oracle建议,超过30%的bitmap index应该rebuild。
1.3.4 分区partition
分区:将表数据划分成更小的子集。
好处:
1)提高可用性。
如100GB的表,如果划分成2G的50个分区,只要当前查询的数据所处的分区online,而其他的分取offline,数据库依然工作正常。
2)减轻管理负担。
对分区数据的维护,比如删除、更新、分析、数据恢复等,可以以分区为单位进行维护。
3)提高DML和查询操作性能。
利用CBO的分区排除机制,跳过未含有相关数据的表分区,减少I/O。
分区表使用CBO,CBO具有很好的“分区意识能力”,直接排除不属于查询结果的分区。(分区键列上同样不能应用函数,否则不会使用索引)
对于分区的表,应尽可能的利用分区键作为查询条件,不然会执行full table scan,会比不分区的全表扫描花费更多的时间,失去分区的意义。
分区信息可查询:select * from user_tab_partitions;
(比如小区表,可以按小时分区,小时里再按hash分区防止分区不均匀,此时再对各分区进行truncate等维护,就快了)
1.3.4.1 创建分区
分区可分为如下几种:(范围分区,hash分区,列表分区,范围-hash分区,范围-列表分区(oracle 9i relase 2以后才提供))
范围分区
使用列值的范围来确定一个数据行被插入到那个分区中。
1)分区键最多可16列,一个表最多可65636个分区。
2)分区范围中不能有任何空隙。
3)每个分区中,等于上限的值都是存储在上一个分区中的。
4)less then子句指定的值,必须是一个用RPAD函数填充过的值、日期(必须包含世纪)或常数。
5)分区表不能包含带有long,long raw的数据列。
6)试图插入一个无法放入任一分区的数据,都导致ORA-14400错误。
7)通过更新数据使数据在分区间移动不被允许,除非创建表的时候指定了enable row movement子局。
如果插入的数据导致分区不均匀,应考虑使用散列分区。
SQL>create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY RANGE (graduation_date)
(PARTION p_2000 VALUES LESS THEN
(to_date(‘2000-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab01,
PARTION p_2001 VALUES LESS THEN
(to_date(‘2001-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab02,
PARTION p_error VALUES LESS THEN
(MAXVALUE) TABLESPACE hist_tab03
);
SQL> select * from student_history (p_2000);
列表分区
类似范围分区,区别是它基于一组指定的值。范围分区是基于一个范围。
试图插入一个无法放入任一分区的数据,都导致ORA-14400错误。
SQL>create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY LIST (degree)
(PARTION p_undergrad VALUES (‘BS’,’BA’,’BBA’,’BFA’)
TABLESPACE hist_tab01,
PARTION p_graduate VALUES (‘MA’,’MBA’,’MFA’,’MS’)
TABLESPACE hist_tab02,
PARTION p_doctorate VALUES (‘PHD’)
TABLESPACE hist_tab03
);
散列分区
使用一个散列算法来分配数据被插入到那个分区中。一般分配很均匀,对于序数的列很适合。
1)分区键应具有很高基数。
2)如果是唯一键分区,效果最好。如果是范围查找,不会有性能提升。
3)通过更新数据使数据在分区间移动不被允许。
4)总分区数,应该是2的整数倍。
SQL> create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY HASH (student_id)
PARTITION 3
STORE IN (hist_tab01, hist_tab02, hist_tab03);
drop table part_ALARMTEXTDATA;
create table part_ALARMTEXTDATA
( ALARMNUMBER VARCHAR2(16) NOT NULL ,
ALARMTEXT VARCHAR2(255) NOT NULL ,
SERIAL NUMBER(38) NOT NULL)
PARTITION BY HASH (ALARMNUMBER)
(part_ALARMTEXTDATA_01 tablespace hxj_partion01,
part_ALARMTEXTDATA_02 tablespace hxj_partion02,
part_ALARMTEXTDATA_03 tablespace hxj_partion03,
part_ALARMTEXTDATA_04 tablespace hxj_partion04);
组合分区
创建范围分区,在该分区内又再创建散列分区。(一般用在需要范围分区,而范围分区又不均匀的情况下)
1)分区是逻辑结构,表数据被存储在子分区级上。
2)组合分区对:分区级的、历史的、日期的,查询十分好使。
3)组合分区对子分区级的并行操作也十分有用。
4)分区级的连接操作通过使用组合的局部索引支持。
SQL> create table student_history
(student_id number(10),
degree varchar2(3),
gradution_date date)
PARTITION BY RANGE (graduation_date)
SUBPARTITION BY HASH (student_id)
SUBPARTITIONS 2
STORE IN (hist_tab01, hist_tab02)
(
PARTION p_2000 VALUES LESS THEN
(to_date(‘2000-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab01,
PARTION p_2001 VALUES LESS THEN
(to_date(‘2001-1-1’,’yyyy-mm-dd’)) TABLESPACE hist_tab02,
PARTION p_error VALUES LESS THEN
(MAXVALUE) TABLESPACE hist_tab03
);
1.3.4.2 索引分区
唯一所以必须是全局的。
分两类,全局与局部索引,前缀与非前缀索引。
全局与局部索引:与该索引的分区结构是否与被索引基础表结构匹配有关系。
局部索引:索引中的分区与基础表的分区逐个匹配。
- 可以人任何分区上创建局部分区索引。
- 创建后,Oracle自动维护表分区与索引分区之间的关系。
- 分区上的位图索引必须是局部的索引。
SQL> create index dinya_idx_t on dinya_test(item_id)
local
(
partition idx_1 tablespace dinya_space01,
partition idx_2 tablespace dinya_space02,
partition idx_3 tablespace dinya_space03
);
Index created.
SQL>
全局索引:索引中的分区与基础表的分区数不逐个匹配。
- 可以人任何分区上创建全局分区索引,但它自身必须是范围的。
- 最高分区必须以MAXVALUE参数来定义。
- 对分区表的维护操作(drop ,truncate操作等),会导致全局索引无效。此时必须重建。
- 使用global创建与表分区一样多的索引,Oracle也不会认为是局部索引。
SQL> create index dinya_idx_t on dinya_test(item_id)
global partition by range(item_id)
(
partition idx_1 values less than (1000) tablespace dinya_space01,
partition idx_2 values less than (10000) tablespace dinya_space02,
partition idx_3 values less than (maxvalue) tablespace dinya_space03
);
Index created.
global 子句允许指定索引的范围值,这个范围值为索引字段的范围值.
SQL>
或
SQL> create index dinya_idx_t on dinya_test(item_id);
Index created.
SQL>
前缀与非前缀索引:与该索引是否有分区键及分区键出现在索引结构内的位置有关系。
前缀索引:索引的最左列与分区键相同。可以是唯一的,也可以不是唯一的。
前缀局部索引:
SQL>create index student_history_lp_idx on student_history (graduation_date) local;
此时默认与基础表分区数一样。以graduation_date范围分区。
前缀全局索引:
略。
非前缀索引:索引的最左列与分区键不相同。可以是唯一的(唯一时分区键必须是索引的子集),也可以不是唯一的。
非前缀局部索引:
SQL>create index student_history_lp_idx on student_history (graduation_date) local;
此时默认与基础表分区数一样。以graduation_date范围分区。
非前缀全局索引:
略。
分区索引不能作为整体一次重建。
alter index local2_alarminfo rebuild partition l_ind2_alarminfo_050915;
1.3.4.3 管理分区
1.1.1.1.1 收集分区的统计数据
可以针对段、分区或子分区级上收集。
例(收集分区表和分区索引):
SQL>execute dbms_stats.gather_table_stats(ownname=>’APPS’,tabname=>’STUDENT_HISTORY’,partname=>’P_1998’,granularity=>’PARTITION’);
SQL>execute dbms_stats.gather_index_stats(ownname=>’SYS’,indname=>’STUDENT_HISTORY_GP_IDX’,partname=>’P_200n’);
http://hi.baidu.com/zting0103/blog/item/0b42b029885097fd98250a63.html
发表评论
-
教你快速掌握Oracle数据库中的like优化-性能调优
2011-12-08 13:55 12021。尽量不要使用 like '%..%' 2 ... -
嵌套SQL的查询速度比较分析
2011-12-08 13:55 1345嵌套SQL的查询速度比较分析 文章中使用Oracle自带的H ... -
Oracle执行计划详解
2011-07-26 11:40 1052Oracle执行计划详解 --- 作者:TTT BLOG 本文 ... -
闲谈Oracle执行计划的步骤顺序
2011-07-13 17:45 1253经过长时间学习Oracle, ... -
lspm_project_end
2011-07-01 17:13 830事务管理概述 “事务”是一个逻辑工作单元,它包括一系列的操作 ... -
oracle表分区详解
2010-12-01 12:17 1011此文从以下几个方面来整理关于分区表的概念及操作: ... -
回滚段探究
2010-10-26 17:09 885http://blog.csdn.net/biti_rainy ... -
block的一些概念
2010-10-26 10:10 1149http://space.itpub.net/12361284 ... -
Oracle Buffer Cache原理总结(一)
2010-10-26 09:53 1464http://space.itpub.net/?uid-123 ... -
oracle的表空间、分区表、以及索引的总结
2010-05-18 15:32 1274表空间: Oracle的UNDOTBS01.DBF文件太大的 ... -
数据库中事务机制的进阶使用(整理)
2009-11-02 10:13 1628在前面的两篇blog中,我写了些关于数据库中的锁方面的一些内 ... -
PL/SQL Developer使用技巧
2009-08-31 13:24 8821、PL/SQL Developer记住登 ... -
oracle中的角色
2009-08-31 13:23 1001一、何为角色? 我 ... -
oracle的异常处理
2009-08-18 11:07 948oracle提供了预定义例外、非预定义例外和自定义例外三 ... -
在Oracle中使用自治事务保存日志表条目
2009-08-18 10:41 1140[size=x-large] [摘要] ... -
Oracle内存参数调优技术详解
2009-07-31 16:46 1667[size=large] 前言 近来公司技术,研发都在 ... -
如何在WebLogic 8.1.6环境中查找有连接池泄漏的代码
2009-07-31 13:09 2701[size=large] 解决连接池泄漏步骤 登录we ... -
Oracle导出程序Exp的使用
2009-07-16 12:23 2725http://www.blogjava.net/xiaohu/ ... -
createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,Re
2008-11-25 17:14 1081用缺省设置创建时,ResultSet 是一种只能访问一次(on ... -
oracle 闪回查询
2008-11-21 14:22 1423--对一般用户如果想执行 闪回查询 需要设置下列3个参数! 1 ...
相关推荐
Oracle的`REVERSE`函数对于包含空格的字符串也会保留空格,如`SELECT REVERSE('1234 ') FROM DUAL`将返回`4321`,长度为8,包括空格。 在SQL Server中,`REVERSE`函数的灵活性更高,它可以接受`VARCHAR`或`NVARCHAR...
本文将对 Oracle SQL 函数大全进行分类和讲解,涵盖字符串函数、字符转换函数、去空格函数、取子串函数、字符串比较函数、字符串操作函数等多种函数。 一、字符转换函数 字符转换函数是将字符或字符串从一种形式...
其中,Oracle函数作为数据库操作的核心工具之一,对于提高查询效率、简化数据处理流程具有不可替代的作用。本文将深入探讨Oracle中一系列实用函数的应用,旨在帮助读者更高效地进行数据库管理和数据挖掘。 ### 一、...
除此之外,Oracle还有其他很多功能强大的函数,如TRIM(同时去除字符串两侧的指定字符)、TRANSLATE(替换字符串中的一组字符为另一组字符)、REVERSE(反转字符串)等。这些函数在SQL查询和数据处理中发挥着重要...
Oracle数据库系统是一个广泛使用的商业关系型数据库管理系统(RDBMS),它提供了多种内建的函数,以便于用户在进行数据查询、数据处理、以及数据转换等操作时能够更加便捷。本文档将详细介绍初学者在学习Oracle...
13. **REVERSE()** 函数(Oracle 12c及以上版本): 此函数用于反转字符串。例如,`REVERSE('hello')` 返回 'olleh'。 在实际应用中,这些函数可以组合使用,实现更复杂的字符串操作。例如,你可以结合使用SUBSTR...
Oracle数据库系统提供了丰富的内置函数,方便用户在处理数学计算、字符串操作以及日期和时间处理时进行高效的工作。在第12章"Oracle系统函数的应用"中,主要涵盖了以下几个方面的内容: 1. **数学函数**: - **ABS...
本文档将详细介绍Oracle 11g中的一些常用函数,包括字符串函数、正则表达式函数、数字函数、转换函数以及日期函数等,帮助用户更好地理解和掌握这些函数的应用场景。 #### 二、字符串函数 1. **ASCII(s)**:此函数...
总结来说,通过使用自定义的`N_REVERSE`函数和Oracle内置的`REVERSE`、`SUBSTR`以及`INSTR`函数,我们可以有效地处理包含层次信息的字符串,截取出其首级部门和末级部门。在处理多层路径和非ASCII字符时,正确处理...
在Oracle SQL中,没有内置的函数可以直接将数字转换为汉字大写的金额。因此,我们需要编写自定义的函数来完成这个任务。这里提供一个名为`num2rmb`的函数示例,这个函数通常会包含在`num2rmb.sql`文件中。 `num2rmb...
Oracle提供了一些内置函数和自定义方法来实现这个功能。本文将深入探讨如何在Oracle中进行这种转换,并以PSQL(PostgreSQL的交互式命令行工具)为例,尽管题目中提及的是Oracle,但通常这类转换更多的是在SQL层面...
通过使用`reverse()`函数,查询能够利用`test_like__name_reverse`索引。 #### 五、结论 通过对Oracle LIKE操作符的深入理解和合理优化,可以显著提高数据库查询性能。特别是通过创建适当的索引和使用反向索引...
- Function-Based索引:基于函数的结果创建索引,索引列是函数的输出。 - Reverse索引:反向键索引,用于存储数据的反向副本,提高某些查询性能。 - Unique索引:确保列中的值是唯一的。 - Index-Organized ...
在SQL语言中,函数是处理数据的重要工具,尤其在数据库管理中,它们使得对数据的检索、转换和...在实际工作中,还需要根据所使用的具体数据库系统(如SQL Server、MySQL、Oracle等)了解其特定的函数用法和扩展功能。
以上知识点涵盖了Oracle PL/SQL的基础知识,包括存储过程、函数、触发器、数据类型、动态SQL、索引类型、约束等关键概念及其应用方法。通过理解和掌握这些知识点,可以帮助开发者更好地进行数据库设计和开发工作。
综上所述,Oracle优化不仅涉及SQL语句的优化,还包括PL/SQL编程技巧、系统函数与系统包的有效利用、DBA管理技能以及Oracle工具的应用等多个方面。掌握这些技术和方法有助于提高Oracle系统的性能和稳定性。
3. **反向索引(Reverse Index)** 反向索引主要应用于长文本字段,如CLOB和NCLOB,将索引键的最后一个字节作为第一个字节存储,提高查询性能。 4. **函数索引(Function-Based Index)** 允许基于列的函数结果...
Oracle支持多种类型的索引,包括B树索引、位图索引、函数索引和唯一索引等。B树索引是最常见的一种,适用于频繁的查询操作;位图索引则适合于低基数(非唯一或重复值多)的列,适用于数据仓库环境;函数索引允许基于...