《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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章