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

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_INDEXES
SQL> 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                        NORMAL
PK_EMP                         NORMAL
EMP_SAL_BMPINDEX               BITMAP
EMP_JOB_REVERSE_INDEX          NORMAL/REV
EMP_DEPTNO_INDEX               NORMAL/REV
QQ_UK                          NORMAL
SYS_C0011198                   NORMAL

7 rows selected.

2、显示索引列
dba_ind_columns,all_ind_columns,user_ind_columns
SQL> 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_segments
SQL> 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_expressions
SQL> 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                   NORMAL
QQ_UK                          NORMAL
PK_EMP                         NORMAL
EMP_DEPTNO_INDEX               NORMAL/REV
EMP_SAL_BMPINDEX               BITMAP
EMP_JOB_REVERSE_INDEX          NORMAL/REV
EMP_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 sysdba
Connected.
SQL> grant create any view to scott;

Grant succeeded.

SQL> conn scott/tiger
Connected.
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 a15
SQL> select * from emp_view_union;

DNAME           LOC                  EMPNO ENAME
--------------- --------------- ---------- ---------------
RESEARCH        DALLAS                7369 SMITH
RESEARCH        DALLAS                7566 JONES
RESEARCH        DALLAS                7788 SCOTT
RESEARCH        DALLAS                7876 ADAMS
RESEARCH        DALLAS                7902 FORD

10.2.2 管理视图
1、查看视图定义
数据字典:user_views
SQL> 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.ename
from emp e,dept d
where 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 sysdba
Connected.
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 sysdba
Connected.
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和currval
nextval将返回序列生成的下一个序列号
currval则返回序列的当前序列号
首次引用序列时,必须使用伪列nextval
SQL> 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.

你可能感兴趣的:(oracle,数据对象)