oracle索引的建立以及使用

以下内容是整理的网上的一些资料:

创建索引:

用户登录:
SQL> conn as1/as1
Connected.

创建表:
SQL> create table dex (id int,sex char(1),name char(10));
Table created.

向表中插入1000条数据
SQL> begin
 for i in 1..1000
 loop
 insert into dex values(i,'M','chongshi');
 end loop;
 commit;
 end;
 /

PL/SQL procedure successfully completed.

查看表记录
SQL> select * from dex;
        ID SE NAME
---------- -- --------------------
       ... . .....
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
rows selected.

创建索引:
SQL> create index dex_idx1 on dex(id);
Index created.
注:对表的第一列(id)创建索引。

查看创建的表与索引
SQL> select object_name,object_type from user_objects;

OBJECT_NAME                  OBJECT_TYPE
--------------------------------------------------------------------------------
DEX                           TABLE
DEX_IDX1                      INDEX
索引分离于表,作为一个单独的个体存在,除了可以根据单个字段创建索引,也可以根据多列创建索引。 Oracle 要求创建索引最多不可超过 32 列。

SQL> create index dex_index2 on dex(sex,name);
Index created.

SQL>  select object_name,object_type from user_objects;

OBJECT_NAME                           OBJECT_TYPE
--------------------------------------------------------------------------------
DEX                                       TABLE
DEX_IDX1                                 INDEX
DEX_INDEX2                               INDEX

这里需要理解:

  编写一本书,只有章节页面定好之后再设置目录;数据库索引也是一样,只有先插入好数据,再建立索引。那么我们后续对数据库的内容进行插入、删除,索引也需要随之变化。但索引的修改是由oracle自动完成的。

SQL> select * from dex where id>23 and id<32;

        ID SE NAME
---------- -- --------------------
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
M  chongshi
rows selected.

如上面查找的列子,通过索引的方式先找到第 23 条数据,再找到第 32 条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。

提问:

在网上就找不到一个入门的例子 都是一些高深的 看不懂的 好多参数根本不懂 也没有解释....找了一个...这样的改了一下
create index abook2_idx on abook2(name)
tablespace user
pctfree 10
initrans 2
maxtrans 255
storage
(
  initial 64K
  minextents 1
  maxextents unlimited
)
 他提示我 ORA-02216: 需要表空间名
 那个user是我瞎写的...应该写什么啊 还有下面那几个参数能解释一下吗?
回答:

create index abook2_idx on abook2(name):是指你创建的索引名是“ abook2_idx ”,该索引是基于并且在abook2表的name列上。
tablespace user :是指你创建的这个索引放在哪个表空间下面。
pctfree 10:是指你创建的索引至少要保留10%作为空闲空间,以便插入与删除。
initrans 2:支持并发操作的初始事务量
maxtrans 255:支持并发操作的最大事务量。
initial 64K:一个区得大小为64K。
minextents 1:是指初始区的个数为1个。区是oracle的最小单位,对应的就是磁盘空间。
maxextents unlimited:这个当然就是最大区的个数无限制。

“他提示我 ORA-02216: 需要表空间名
 那个user是我瞎写的...应该写什么啊 还有下面那几个参数能解释一下吗?”
上面的意思是叫你把你创建的索引放在oracle已有的一个表空间中,一般为了保证系统系能,建议你专门创建一个索引表空间,用来存放索引。

回答:

create index abook2_idx on abook2(name)
只要这句,其余删掉
追问
create index abook2_idx on abook2(name)
 不行 显示这个..
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
回答
建议重启服务,环境问题

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

提问:

oracle数据库:

1、select * from table where a=a and b=b and c=c and d=d;
这里我建立了一个a,b,c,d的复合索引,但如果使用:
select * from table where a=a and b=b;
进行查询时第一次很慢,第二次之后再查就快了,应该是使用了数据库的缓冲区进行的查询,那这个abcd的复合索引对于where a=a and b=b;就不起作用了么?如果有若干个SQL:
select * from table where a=a;
select * from table where a=a and b=b;
select * from table where a=a and b=b and c=c;
select * from table where a=a and b=b and c=c and d=d;
等等,总不能对每个where条件建立一个索引?

2、有没有SQL可以查询某个SQL执行时是否使用索引了?

谢谢!
where a=变量a;
where a=变量a and b=变量b;
where a=变量a and b=变量b and c=变量c;
where a=变量a and b=变量b and c=变量c and d=变量d;
这些都可以用abcd这个复合索引?
但从现在执行的时间来看,a=变量a这里是没有用到索引的,不知道有什么方法可以让它走索引么?

提问者采纳

1,第一次查询慢,以后就快了,主要是因为第一次要进行磁盘操作,以后数据被cache到内存中了,不在操作磁盘,所以就快了。
2,对于你说的这四种查询,where条件中的a=a估计你是举例子这样写的吧。实际上应该是a=变量A。其他的b,c,d也是这样。那么这种语句都是可以利用你说的复合索引的。如果是RBO优化器,这四句都应该用索引。但是oracle现在推荐的CBO优化器不能保证你都走索引。
3,到底用没用索引,你可以从v$sqlaera中找到你的语句对应的hash_value,然后从v$sql_plan中找到语句的执行计划,通过执行计划确认你的语句是不是使用了索引。
具体语句你可以类似如下写法:

select hash_value,sql_text from v$sqlarea where upper(sql_text) like '%你需要查找的sql语句的特征片段%'

select * from v$sql_plan where hash_value = 上一句查到的hash_value


参考资料:http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html

索引应该注意的:http://liusuper.iteye.com/blog/219013

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值