ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基础学习之索引 【转】

基础学习之索引 【转】

原创 Linux操作系统 作者:appleman1983 时间:2012-10-17 14:48:07 0 删除 编辑
索引
现了解一下几个要点
索引的目的是加快在一个巨大的表中查询少量行的速度
索引中的值将会随表的改变而改变,因此索引增加了DML操作时的负担
索引的使用是透明的,只要有合适的索引,oracle会自动的使用
不必要的索引应及时删除
索引能用指针加速行的取回,索引是可以被显式创建的,也可以被自动创建。如果你在列上没有索引,那么oracle服务器将进行全表扫描。索引由oracle服务器自动使用和维护,一旦一个索引被创建,它就不再需要用户直接管理
索引逻辑的和物理的独立于他们索引的表, 任何时候都可以创建和删除索引并且不影响基表和其它索引,但是当你删除表时相应的索引也被删除。
(了解:rowid是一个十六进制的串,表示包含块定义的行地址。行的位置在块中,并且有数据库文件标识符,访问任何指定的行的最快的方法是引用它的rowid。)
创建索引:
有关索引的创建有两种索引:唯一性索引、非唯一性索引
唯一性索引:当你在一个表中定义一个列为主键或者定义一个唯一键约束时oracle服务器自动创建该索引,索引的名字习惯上是约束的名字
非唯一性索引:它可以由用户手动创建
如果想在自己的方案下创建索引,你必须得有create index权限,而如果想在任何方案中创建索引,你必须得有create any index权限
创建索引的语法:
CREATE INDEX index ON table (col1,col2...);
范例:
SQL> desc jocky;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(10)
 SEX                                                VARCHAR2(5)
 MAIL                                               VARCHAR2(25)
 SALARY                                             NUMBER
SQL> create index mail_salary_index on jocky (mail,salary);
Index created.
注意:并不是在表上创建的索引越多就意味着查询数据时就越快,因为你在表上所操作的每个DML语句oracle服务器都得更新到索引的,所以当索引越多的情况下反到降低了oracle服务器的操作效率。这里不要忘记了,如果你想强制索引非唯一,你应该在表中定义一个唯一的约束,然后唯一索引就被自动创建了。
复合索引:指的是在一个表中的多个列上创建索引,像上面的那个范例其实就是一个复合索引。
查询索引:
我们可以从user_indexes数据字典视图可以确认索引的存在,你也可以查询user_ind_columns视图来检查与索引有关的列。
范例:
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
MAIL_SALARY_INDEX
PK_EMP
PK_DEPT
SQL> select index_name,table_name,column_name from user_ind_columns;
INDEX_NAME           TABLE_NAME           COLUMN_NAME
-------------------- -------------------- --------------------
PK_DEPT              DEPT                 DEPTNO
PK_EMP               EMP                  EMPNO
MAIL_SALARY_INDEX    JOCKY                SALARY
MAIL_SALARY_INDEX    JOCKY                MAIL
基于函数的索引
基于函数的索引用UPPER(列名)或者LOWER(列名)关键字定义,它允许大小写敏感的查询。如下:
CREATE INDEX sunboy ON jocky (upper(name));
这样就使得处理查询容易了,如:
select * from jocky where upper(name)='JOCKY';
这样就确保了oracle服务器使用索引而不是执行一个全表扫描。这里的函数值不能为空,不然oracle服务器还是执行一次全表扫描。
如果想创建基于函数的索引,你必须得有create index和query rewrite系统权限,而如果想在另外的方案中或另外方案中的表上创建索引,必须得有create any index和global query rewrite权限。在基于函数的索引中,表的所有者也必须有关于函数的使用execute对象的权限,得同时确保下面的两个参数符合显示出来的值:
SQL> show parameter query;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled                string      TRUE
query_rewrite_integrity              string      enforced
删除索引
这里切记索引是不能修改的,为了修改它,你必须先删除它,然后重新创建。而如果想删除索引,你必须是索引的所有者或者具有drop any index的权限,但是如果你删除一个表,相关的索引和约束也将被删除,但是视图和序列将保留的。
范例:
SQL> drop index mail_salary_index;
Index dropped.

转自:http://blog.chinaunix.net/uid-23235375-id-2482744.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9472111/viewspace-746620/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-10-15

  • 博文量
    10
  • 访问量
    17117