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

我现在有一个SQL语句 
SELECT FAQID,
FAQNAME,
TYPE,
CREATOR,
TOQUESTION,
SUPERCODE
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语句又该怎写?

-------------------------------------------------------------------------------------------------------------------------------------------------

nameidrowid  rowidid
王一           1x001  x001               1
王二           2x002  x002               2
王三           3x003  x003               3
    索引
select * from 表 where id = 3
索引是由where条件触发的 ,此查询语句中指定id=3,因为有索引直接从索引段中找到id=3对应的rowid,然后就可以快速用rowid快速找到表中的记录,如果没有索引,就是一行一行的查找id=3的记录

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

(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;   //创建分区全局索引

扩展资料:


1、如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
2、至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引
3、小表不要简历索引
4、对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引
5、列中有很多空值,但经常查询该列上非空记录时应该建立索引
6、经常进行连接查询的列应该创建索引
7、使用create index时要将最常查询的列放在最前面
8、LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
9、限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)


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


查看指定表上现有索引详情
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;

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他山之石女士

你一元我一元,是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值