我现在有一个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、限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)
上面这张图,我画得比较粗糙,但是基本原理已经展现了!
下面再写几种常见索引的创建吧:
(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;
兄弟,希望可以帮到你