Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121373
  • 博文数量: 37
  • 博客积分: 2094
  • 博客等级: 大尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-14 08:39
文章分类
文章存档

2010年(37)

分类: Oracle

2010-10-12 09:53:56

索引
现了解一下几个要点
索引的目的是加快在一个巨大的表中查询少量行的速度
索引中的值将会随表的改变而改变,因此索引增加了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.
同义词
为了查询其它用户所拥有的表,你需要将该用户名加句点作为前缀加在表名前面,如:
SQL> show user;
USER is "SYS"
SQL> select * from scott.jocky;
        ID NAME       SEX   MAIL                          SALARY
---------- ---------- ----- ------------------------- ----------
         1 jocky      man  
              10000
         2 mike       man  
                    6000
         3 john       woman
                    4800
         4 blues      man  
                   7500
         5 write      woman
                   6500
而创建同义词可以除去对象名必须带的方案限制,所以说该方法对于具有特别长的对象名字很有作用。
语法:
CREATE [PUBLIC] SYNONYM synonym FOR object;
PUBLIC:创建一个可以被所有用户访问的同义词
synonym:要被创建的同义词的名字
object:指出要创建同义词的对象,这里得注意了,对象不能包含包
创建和删除同义词(默认情况下创建和删除同义词是数据库管理员的权限)
SQL> show user;
USER is "SYS"
SQL> create public synonym sunboy for scott.jocky;
Synonym created.
SQL> select * from sunboy;
        ID NAME       SEX   MAIL                          SALARY
---------- ---------- ----- ------------------------- ----------
         1 jocky      man  
              10000
         2 mike       man  
                    6000
         3 john       woman
                    4800
         4 blues      man  
                   7500
         5 write      woman
                   6500
删除同义词:
SQL> drop public synonym sunboy;
Synonym dropped.
SQL> select * from sunboy;
select * from sunboy
              *
ERROR at line 1:
ORA-00942: table or view does not exist
 
阅读(1986) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~