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.