您的位置:首页 > 数据库 > Oracle

《Oracle从入门到精通》读书笔记第十章 其他数据对象

2014-03-18 11:39 531 查看
10.1 索引对象10.1.1 索引概述索引类型按照存储方式可以分为:B树索引、位图索引、反向索引和基于函数的索引按照唯一性可以分为:唯一索引和非唯一索引按照索引列的个数可以分为单列索引和复合索引
建立索引时必须注意一下几点:a、索引应该建立在where子句频繁引用表列上,如果在大表上频繁使用某列或某几个列作为条件执行索引操作,并且检索行数低于总行书15%,那么应该考虑在这些列上建立索引。b、如果经常需要基于某列或某几个列执行排序操作,那么在这些列上建立索引可以加快数据排序速度。c、限制表的索引个数,索引主要用于加快查询速度,但会降低DML操作的速度。d、指定索引块空间的使用参数。e、将表和索引部署到相同的表空间,可以简化表空间的管理,将表和所有部署到不同的表空间,可以提高访问性能。f、当在大表上建立索引时,使用nologging选项可以最小化重做记录。使用nologging选项可以节省重做日志空间,降低索引建立时间,提高索引并行建立的时间。g、不要在小表上建立索引。h、为了提高多表连接的性能,应该在连接列上建立索引
10.1.2 创建索引1、建立B树索引(balanced)最常用的索引类型(默认)如果表包含的数据非常多,并且经常在where子句中引用某列或某几个列,则应该基于该列或这几个列建立B树索引。无论索引条目位于何处,都只需要花费相同的I/O即可获取。
SQL> create index emp_deptno_index on emp(deptno) 2 pctfree 25 3 tablespace users;
Index created.
2、建立位图索引当列的基数很低时,为其建立B树索引显然不合适,Oracle推荐当一个列的基数小于1%时,适合建立位图索引。SQL> create bitmap index emp_sal_bmpindex 2 on emp(sal) 3 tablespace users;
Index created.
初始化参数create_bitmap_size用于指定建立位图索引时分配的位图区大小,默认值为8MB,越大建立位图索引的速度越快。
3、建立反向键索引是一种特殊类型的B树索引,在顺序递增列上建立索引时非常有用。SQL> create index emp_job_reverse_index 2 on emp(job) reverse 3 tablespace users;
Index created.
SQL> alter index emp_deptno_index 2 rebuild reverse;
Index altered.
4、基于函数的索引SQL> select empno,ename,sal 2 from emp 3 where job=upper('manager');
EMPNO ENAME SAL---------- ------------------------------ ---------- 7566 JONES 2975 7698 BLAKE 2850 7782 CLARK 2450
基于函数的索引只是常规的B树索引,但它存放的数据是由表中的数据应用函数后得到的。SQL> create index emp_job_fun_index 2 on emp(lower(job));
Index created.
10.1.3 修改索引清除索引中的存储碎片:重建索引或合并索引合并索引只是将B树中叶子节点的存储碎片合并在一起,并不会改变索引的物理组织结构SQL> alter index emp_deptno_index 2 coalesce deallocate unused;
Index altered.
SQL> alter index emp_deptno_index rebuild 2 tablespace example;
Index altered.
10.1.4 删除索引SQL> drop index emp_job_fun_index;
Index dropped.
10.1.5 显示索引信息1、显示表的所有索引DBA_INDEXES,ALL_INDEXES,USER_INDEXESSQL> col index_name for a30;SQL> col index_type for a20;SQL> select index_name,index_type 2 from dba_indexes 3 where owner='SCOTT';
INDEX_NAME INDEX_TYPE------------------------------ --------------------PK_DEPT NORMALPK_EMP NORMALEMP_SAL_BMPINDEX BITMAPEMP_JOB_REVERSE_INDEX NORMAL/REVEMP_DEPTNO_INDEX NORMAL/REVQQ_UK NORMALSYS_C0011198 NORMAL
7 rows selected.
2、显示索引列dba_ind_columns,all_ind_columns,user_ind_columnsSQL> col column_name for a30;SQL> select column_name,column_length 2 from user_ind_columns 3 where index_name='EMP_DEPTNO_INDEX';
COLUMN_NAME COLUMN_LENGTH------------------------------ -------------DEPTNO 22

3、显示索引段位置及其大小dba_segments,user_segmentsSQL> col tablespace_name for a20;SQL> col segment_name for a20;SQL> select tablespace_name,segment_name,bytes 2 from user_segments 3 where segment_name='EMP_DEPTNO_INDEX';
TABLESPACE_NAME SEGMENT_NAME BYTES-------------------- -------------------- ----------EXAMPLE EMP_DEPTNO_INDEX 65536

no rows selected
4、显示函数索引dba_ind_expressions,user_ind_expressionsSQL> create index emp_job_fun_index 2 on emp(lower(job));
Index created.
SQL> select index_name,index_type 2 from user_indexes;
INDEX_NAME INDEX_TYPE------------------------------ --------------------SYS_C0011198 NORMALQQ_UK NORMALPK_EMP NORMALEMP_DEPTNO_INDEX NORMAL/REVEMP_SAL_BMPINDEX BITMAPEMP_JOB_REVERSE_INDEX NORMAL/REVEMP_JOB_FUN_INDEX FUNCTION-BASED NORMA L
PK_DEPT NORMAL
8 rows selected.
SQL> select column_expression 2 from user_ind_expressions 3 where index_name='EMP_JOB_FUN_INDEX';
COLUMN_EXPRESSION--------------------------------------------------------------------------------LOWER("JOB")
10.2 视图对象10.2.1 创建视图不占用存储空间语法格式:create [or replace] view <view_name> [alias[,alias]...]as <subquery>[with check option][constraint constraint_name][with read only]
1、简单视图基于单个表建立,不包含任何函数,表达式和分组数据SQL> conn / as sysdbaConnected.SQL> grant create any view to scott;
Grant succeeded.
SQL> conn scott/tigerConnected.SQL> create or replace view emp_view as 2 select empno,ename,job,deptno 3 from emp 4 where deptno=20;
View created.
SQL> select * from emp_view;
EMPNO ENAME JOB DEPTNO---------- ------------------------------ --------------------------- ---------- 7369 SMITH CLERK 20 7566 JONES MANAGER 20 7788 SCOTT ANALYST 20 7876 ADAMS CLERK 20 7902 FORD ANALYST 20
SQL> insert into emp_view 2 values(9527,'STONE','MANAGER',20);
1 row created.
SQL> update emp_view 2 set ename='STONEBOX' 3 where empno=9527;
1 row updated.
SQL> select * from emp_view;
EMPNO ENAME JOB DEPTNO---------- ------------------------------ --------------------------- ---------- 9527 STONEBOX MANAGER 20 7369 SMITH CLERK 20 7566 JONES MANAGER 20 7788 SCOTT ANALYST 20 7876 ADAMS CLERK 20 7902 FORD ANALYST 20
6 rows selected.
SQL> delete from emp_view 2 where empno=9527;
1 row deleted.
SQL> commit;
Commit complete.
2、建立只读视图定义只读视图后,用户只能在视图上执行select语句SQL> create or replace view emp_view_readonly as 2 select * from dept 3 where deptno!=88 4 with read only;
View created.
SQL> update emp_view_readonly 2 set loc='BOSTON';set loc='BOSTON' *ERROR at line 2:ORA-42399: cannot perform a DML operation on a read-only view
3、复杂视图SQL> create or replace view emp_view_complex as 2 select deptno,max(sal) as maxsal,min(sal) as minsal,avg(sal) as avgsal 3 from emp 4 group by deptno;
View created.
SQL> select * from emp_view_complex 2 order by deptno;
DEPTNO MAXSAL MINSAL AVGSAL---------- ---------- ---------- ---------- 10 5000 2450 3402.77667 20 3000 2758.33 2898.332 30 2850 2758.33 2773.60833
4、连接视图基于多个表建立的视图SQL> create or replace view emp_view_union as 2 select d.dname,d.loc,e.empno,e.ename 3 from emp e,dept d 4 where e.deptno=d.deptno and d.deptno=20;
View created.SQL> col dname for a15;SQL> col loc for a15;SQL> col ename for a15SQL> select * from emp_view_union;
DNAME LOC EMPNO ENAME--------------- --------------- ---------- ---------------RESEARCH DALLAS 7369 SMITHRESEARCH DALLAS 7566 JONESRESEARCH DALLAS 7788 SCOTTRESEARCH DALLAS 7876 ADAMSRESEARCH DALLAS 7902 FORD
10.2.2 管理视图1、查看视图定义数据字典:user_viewsSQL> desc user_views Name Null? Type ----------------------------------------- -------- ---------------------------- VIEW_NAME NOT NULL VARCHAR2(30) TEXT_LENGTH NUMBER TEXT LONG TYPE_TEXT_LENGTH NUMBER TYPE_TEXT VARCHAR2(4000) OID_TEXT_LENGTH NUMBER OID_TEXT VARCHAR2(4000) VIEW_TYPE_OWNER VARCHAR2(30) VIEW_TYPE VARCHAR2(30) SUPERVIEW_NAME VARCHAR2(30) EDITIONING_VIEW VARCHAR2(1) READ_ONLY VARCHAR2(1)
SQL> select text from user_views 2 where view_name=upper('emp_view_union');
TEXT--------------------------------------------------------------------------------select d.dname,d.loc,e.empno,e.enamefrom emp e,dept dwhere e.deptno=d.deptno a
2、修改视图定义SQL> create or replace view emp_view_union as 2 select d.dname,d.loc,e.empno,e.ename 3 from emp e,dept d 4 where e.deptno=d.deptno and d.deptno=30;
View created.
3、重新编译视图自动编译视图,或者使用alter view手动编译视图SQL> alter view emp_view_union compile;
View altered.
4、删除视图drop view删除视图SQL> drop view emp_view_union;
View dropped.
10.3 同义词对象不占用实际的存储空间同义词类型:公有同义词和私有同义词SQL> conn / as sysdbaConnected.SQL> create public synonym public_dept for scott.dept;
Synonym created.
SQL> select * from public_dept;
DEPTNO DNAME LOC---------- --------------- --------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 88 design beijing
SQL> grant create synonym to scott;
Grant succeeded.
SQL> grant create public synonym to scott;
Grant succeeded.
SQL> create synonym private_dept for dept;
Synonym created.
SQL> drop synonym private_dept;
Synonym dropped.
SQL> conn scott/tiger as sysdbaConnected.SQL> drop public synonym public_dept;
Synonym dropped.
10.4 序列对象用于生成一系列唯一数字的数据库对象,序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值。
10.4.1 创建序列不占用实际的存储空间语法格式:create sequence <seq_name>[start with n][increment by n][minvalue n | nomainvalue][maxvalue n | nomaxvalue][cache n | nocycle][cycle | nocycle][order | noorder]SQL> create sequence empno_seq 2 maxvalue 99999 3 start with 9000 4 increment by 100 5 cache 50;
Sequence created.
使用序列时,需要用到序列的两个伪列nextval和currvalnextval将返回序列生成的下一个序列号currval则返回序列的当前序列号首次引用序列时,必须使用伪列nextvalSQL> insert into scott.emp(empno,ename,deptno) 2 values(empno_seq.nextval,'STONE',20);
1 row created.
SQL> select empno_seq.currval from dual;
CURRVAL---------- 9000
实际上,在为表生成主键值时,通常是为表创建一个行级触发器,如何在触发器主题中使用序列值替换用户提供的值
10.4.2 管理序列序列的起始值不能修改SQL> alter sequence empno_seq 2 maxvalue 100000 3 increment by 200 4 cache 10;
Sequence altered.
SQL> desc user_sequences; Name Null? Type ----------------------------------------- -------- ---------------------------- SEQUENCE_NAME NOT NULL VARCHAR2(30) MIN_VALUE NUMBER MAX_VALUE NUMBER INCREMENT_BY NOT NULL NUMBER CYCLE_FLAG VARCHAR2(1) ORDER_FLAG VARCHAR2(1) CACHE_SIZE NOT NULL NUMBER LAST_NUMBER NOT NULL NUMBER
SQL> drop sequence empno_seq;
Sequence dropped.本文出自 “石头记” 博客,请务必保留此出处http://stonebox.blog.51cto.com/5409313/1378484
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐