索引
Oracle服务器索引时一个方案对象,它可以通过使用指针来加速对行的检索。索引可以显示创建或自动创建。如果在列上没有索引,则系统会对整个表进行扫描。
使用索引可以直接和快速地访问表中的行。索引的目的是通过使用一个索引的路径来快速查找数据,从而减少必需的磁盘I/O操作。所以你是由Oracle服务器自动使用和维护的。
创建索引
自动创建:如果在表定义中定义了PRIMARY KEY或UNIQUE约束,则系统会自动创建一个唯一索引
手动创建:用户可以在列上创建非唯一的索引,以加速对行的访问。
E.G
(1) 在表EMPLOYEES的LAST_NAME列创建索引
create index emp_last_name_idx on employees(last_name);
(2)删除索引
drop index emp_last_name_idx;
什么情况下要创建索引?
1.列包含较大范围的值
2.列包含大量空值
3.在where子句或联结条件中频繁使用一个或多个列
4.表相当大,但是预计多数的查询检索的行不到总行数的百分之二至百分之四
什么情况下不创建索引?
1.表比较小
2.在查询中不经常使用列作为条件
3.预计多数查询检索的行要超过表中总行数的百分之二至百分之四
4.表更新比较频繁
5.被索引的列将作为表达式的一部分进行使用
E.G
SCOTT>create index idx_ename on emp(ename);手动创建索引
SCOTT>select index_name from user_indexes;查看该用户创建的索引
SCOTT>select ename,sal from emp where ename='SCOTT';
要想知道上面那条查询语句走的是索引还是没有走索引,首先我们打开监控索引的东西
SCOTT>alter index idx_ename monitoring usage;(监控索引)
SYS>select * from object_usage;(系统用户下查看索引,查看object_id=XXX)
SCOTT>select object_id,object_name from user_objects where object_id=XXXX;
SCOTT>alter index idx_ename nomonitoring usage;(关闭索引)
SCOTT>drop index idx_ename;(干掉索引)
序列
序列的用户创建的数据库对象,它可以由多个用户共享,用来生成唯一的整数。
序列的通常用途是创建主键值,主键值对于每行都必须是唯一的。序列由内部的Oracle例行程序生成和递增(或递减)。序列号的存储和生成与表无关,同一序列可以用于多个表。
创建序列
例如,创建一个名为DEPT_DEPTID_SEQ的序列,将它用作表DEPARTMENTS的主键,不使用CYCLE选项。
create sequence dept_deptid_seq
increment by 10
start with 120
maxvalue 9999
nocache
nocycle;
确认序列(查看user_sequences数据字典)
select sequence_name,min_value,max_value,increment_by,last_number from user_sequences;
删除序列
drop sequence dept_deptid_seq;
NEXTVAL和CURRVAL伪例
NEXTVAL会返回下一个可用的序列值。每次被引用时它都会返回一个唯一的值,即使对于不同的用户也是这样。
CURRVAL会获得当前序列值
必须对该序列发出NEXTVAL,然后CURRVAL才能包含值
使用序列
1)在内存中高速缓冲序列值可以更快地访问那些值
2)当发生以下情况时,序列值会出现间断:
--发生回退
--系统崩溃
--在其他表中使用了序列
3)如果创建序列时使用了NOCACHE选项,可以通过查询USER_SEQUENCES表来查看下一个可用的值
同义词
通过创建同义词(对象的另一个名称)可以简化对对象的访问,同义词可以分为私有的和公有的。
可以通过select * from user_synonyms;来查看同义词的信息
优点:易于引用其他用户所拥有的表
缩短冗长的对象名
创建和删除同义词(之前当然要有相应的权限)
SCOTT>create synonym d for dept;(私有的)
SCOTT>drop synonym d;
SYS> create public synonym e for app.hello(公有的,其中app.hello的意思,app为用户,hello为app用户下的表)
SYS>drop public synonym e;
E.G
SYS>grant create synonym to scott;
SCOTT>create synonym d for dept;
SCOTT>select * from d;
假设scott用户存在e表
SYS>create public synonym e for app.hello;
SYS>grant select on app.hello to scott;
SCOTT>select * from e;
SCOTT>drop table e purge;
SCOTT>select * from e;
总结:在进行查询的时候的顺序,有存在表名为e的先执行,没有的话再找私有的,最后才找公有的。