oracle 数据库如何建立索引 如何用索引?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 数据库如何建立索引 如何用索引?相关的知识,希望对你有一定的参考价值。

我现在有一个SQL语句
SELECT FAQID,
FAQNAME,
TYPE,
ORDERID,
CREATOR,
CREATIONTIME,
MODIFYTIME,
MODIFIER,
TOQUESTION,
STATUS,
CODE,
SUPERCODE,
RESULT,
TOCOMMONNESS,
SUPERFAQNO,
SHOWPATH,
extend01,
extend02,
extend03,
extend04,
extend05,
extend06,
extend07,
extend08,
extend09,
extend10
FROM T_KBS_FAQ t
where TYPE = '1'
<[AND FAQID = :faqId]>
<[AND FAQNAME like '%' ||:faqName || '%']>
<[AND CREATOR = :creator]>
<[AND SUPERCODE=:superCode]>
<[AND TOQUESTION=:toQuestion]>
<%:toKngType%>

现在数据过大 导致查询很慢,如何优化? 要建立几个字段建立索引怎么样建立, 建立好了如何使用 SQL语句又该怎写?

创建索引语法:

CREATE [UNIQUE] | [BITMAP] INDEX index_name

--unique表示唯一索引

ON table_name([column1 [ASC|DESC],column2

--bitmap,创建位图索引

[ASC|DESC],…] | [express])[TABLESPACE tablespace_name][PCTFREE n1]

--指定索引在数据块中空闲空间

[STORAGE (INITIAL n2)][NOLOGGING]

--表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用

[NOLINE][NOSORT];

--表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用

扩展资料:

1、如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引

2、至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)

3、小表不要简历索引

4、对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引

5、列中有很多空值,但经常查询该列上非空记录时应该建立索引

6、经常进行连接查询的列应该创建索引

7、使用create index时要将最常查询的列放在最前面

8、LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

9、限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

参考技术A

上面这张图,我画得比较粗糙,但是基本原理已经展现了!


下面再写几种常见索引的创建吧:

(1) create index 索引名 on 表(字段名);     //创建B树索引,一般用的OLTP中

(2) create bitmap index 索引名 on 表(字段名);   //创建位图索引,一般用的OLAP中

(3) create index 索引名 on 表名 (substr(字段,1,10))  

//创建函数索引,有些时候呢,咱们的搜索条件要加上函数,这种情况呢,普通索引就不能解发了,就要创建函数索引

(4) create index 索引名 on 表名 (字段1,字段2......字段n);

//复合索引,当条件中,经常去查询多个条件时,可以把多个条件放在一个索引中

(5)  create index 索引名 on 表(字段 desc);   //排序后创建索引

(6) create index 索引名 on 表名 (字段) reverse; //反转索引,消除热点块

(7) create index 索引名 on 表名(字段) local;   //创建分区本地索引

(8) create index 索引名 on 表名 (字段) global;   //创建分区全局索引




附加维护索引基本操作手段:


查看指定表上现有索引详情


select t.INDEX_NAME,t.COLUMN_NAME,i.index_type 

 from user_ind_columns t,user_indexes i where t.index_name = i.index_name and  t.table_name='表名';


查看索引及列

select t.index_name,t.status from user_indexes t where t.INDEX_NAME in ();



查看指定分区表的所有索引


select t.INDEX_NAME,t.COLUMN_NAME,i.index_type from 

user_ind_columns t,user_indexes i where t.index_name = i.index_name and  

t.table_name='表名';


查询分区索引状态

 

select PARTITION_NAME,STATUS from DBA_IND_PARTITIONS where INDEX_NAME='';



valid:当前索引有效

N/A :分区索引 有效

unusable:索引失效



重新建立索引

ALTER INDEX 用户.索引 REBUILD;



兄弟,希望可以帮到你

参考技术B 方法如下:
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);
例如:
create index index_userid on tbl_detail(userid);
如何找数据库表的主键字段的名称?
SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';
Oracle 在创建主键(可以不加constraint SYS_AAA),会为库表自动创建索引,
索引的列为主键列。 并且当库表某些列名或者库表名改变时候,
Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns
desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS
例子1:更改库表的列名
ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) );
//查找约束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name ='AAA' AND C.CONSTRAINT_TYPE='P';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME ------------------------------ ------------ ------------- SYS_AAA AAA ID
//查找索引
select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES
参考技术C 索引创建语句
create index 索引名 on 表名(字段1,字段2) 限定条件(如唯一性等)
索引使用方法:不用特意使用,Oracle会自动处理

语句优化:
建议你按如下方法优化:
1.评估你语句中能够影响的数据范围,数据范围缩小越快的,放在越后面
2.语句中尽量少用like,如果非用不可,也尽量减少通配符的使用
像你的AND FAQNAME like '%' ||:faqName || '%',有索引等于没有一样,oracle还是要全部数据轮询一遍。
建议换为 and (faqname like '%xxx‘ or faqname like 'xxx%'),这样可能能快一些。
参考技术D create index index_name on T_KBS_FAQ (你想添加为索引的列)
一般情况下一张表的主键就可以了,看你的查询条件,我建议你把 type 设为索引。
另外就是优化,你可以把查询条件换下位置,如下: where
<[AND FAQID = :faqId]>
<[AND FAQNAME like '%' ||:faqName || '%']>
<[AND CREATOR = :creator]>
<[AND SUPERCODE=:superCode]>
<[AND TOQUESTION=:toQuestion]>
<%:toKngType%>
TYPE = '1'
你试一下吧,应该会有所提高的

以上是关于oracle 数据库如何建立索引 如何用索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何用plsql从oracle中导入导出数据

如何用excel为多个word文件建立索引目录

如何用plsql从oracle中导入导出数据

多表关联场景下如何用好分区表?

多表关联场景下如何用好分区表?

如何在ORACLE数据库的字段上建立索引