oracle 数据库如何建立索引 如何用索引? 5
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、限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)
上面这张图,我画得比较粗糙,但是基本原理已经展现了!
下面再写几种常见索引的创建吧:
(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;
兄弟,希望可以帮到你
推荐于2017-09-29 · 知道合伙人数码行家
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
create index 索引名 on 表名(字段1,字段2) 限定条件(如唯一性等)
索引使用方法:不用特意使用,Oracle会自动处理
语句优化:
建议你按如下方法优化:
1.评估你语句中能够影响的数据范围,数据范围缩小越快的,放在越后面
2.语句中尽量少用like,如果非用不可,也尽量减少通配符的使用
像你的AND FAQNAME like '%' ||:faqName || '%',有索引等于没有一样,oracle还是要全部数据轮询一遍。
建议换为 and (faqname like '%xxx‘ or faqname like 'xxx%'),这样可能能快一些。
一般情况下一张表的主键就可以了,看你的查询条件,我建议你把 type 设为索引。
另外就是优化,你可以把查询条件换下位置,如下: where
<[AND FAQID = :faqId]>
<[AND FAQNAME like '%' ||:faqName || '%']>
<[AND CREATOR = :creator]>
<[AND SUPERCODE=:superCode]>
<[AND TOQUESTION=:toQuestion]>
<%:toKngType%>
TYPE = '1'
你试一下吧,应该会有所提高的