1. 程式人生 > 其它 >Oracle筆記16——Oracle序列、索引與同義詞

Oracle筆記16——Oracle序列、索引與同義詞

一、

索引(INDEX):單列索引、複合索引,用於優化查詢效率
自動建立:當建立PRIMARY KEY或UNIQUE 約束時,預設建立索引
手動建立CREATE INDEX idx_tableName_columName ON 表名(列名1[,列名2...])

ROWNUM 偽列
虛擬存在的,每查詢一次資料,永遠從1開始,只能使用 <或者 <=比較

SELECT ROWNUM,e.* FROM emp e;

二、ROWID 偽列

真實存在在物理磁碟中,唯一標識每一行資料的值

----------------------
--建立索引
----------------------
--單列索引 1.在emp表的ename欄位上建立索引. CREATE INDEX idx_emp_ename ON emp(ename); --複合索引(組合索引) 2.在emp表的deptno和job的組合上建立索引 CREATE INDEX idx_emp_deptno_job ON emp(deptno,job); --測試索引 1.建立表emp_bak表,表結構同emp(即複製emp的表結構) CREATE TABLE emp_bak AS SELECT * FROM emp; 2.往emp_bak表中插入大批量資料(單位:百萬) INSERT INTO emp_bak SELECT
* FROM emp_bak;--多次執行,1835008條資料 3.將empno設定為唯一值 --將empno的長度修改為7 ALTER TABLE emp_bak MODIFY (empno NUMBER(7));--1.將empno的長度修改為7 UPDATE emp_bak SET empno = ROWNUM;--2.使用ROWNUM將empno修改為唯一值 UPDATE emp_bak SET empno = seq_emp.nextval;--2.也可以使用nextval將empno修改為唯一值 SELECT * FROM emp_bak; 4.查詢empno為1835008的員工資訊
SELECT * FROM emp_bak WHERE empno = 1835008;--無索引 大約查詢時間為0.20s CREATE INDEX idx_emp_empno ON emp_bak(empno);--建立索引 SELECT * FROM emp_bak WHERE empno = 1835008;--有索引 大約查詢時間為0.01s

三、分析有無索引的區別

----------分析有無索引的區別------------start
--1.無索引
DROP INDEX idx_emp_empno;
SELECT ROWID,emp_bak.* FROM emp_bak WHERE empno = 1835008;--0.2  乾巴巴的查詢了4700多行,才找到該資料

--2.有索引:給empno建立了一個索引,為了維護 1835008 -> AAAR7fAAEAAACwyACq 這段奇妙的關係,需要花代價1835008 -> AAATBlAAEAAAOMfABa 
SELECT ROWID,empno FROM emp_bak WHERE empno = 1835008;--AAAR7fAAEAAACwyACq
AAAR7fAAEAAAACzAAA  1
AAAR7fAAEAAAACzAAB  2
AAAR7fAAEAAAACzAAC  3
AAAR7fAAEAAAACzAAD  4
AAAR7fAAEAAAACzAAE  5
AAAR7fAAEAAAACzAAF  6
AAAR7fAAEAAAACzAAG  7
.....................
AAAR7fAAEAAACwyACq  1835008
②AAATBlAAEAAAOMfABa -> 1835008對應的資料
SELECT ROWID,emp_bak.* FROM emp_bak WHERE ROWID = 'AAAR7fAAEAAACwyACq';--0.01 查詢了1行
----------分析有無索引的區別------------end

---------------
--刪除索引
-----------------
DROP INDEX idx_emp_empno;

四、資料字典表

SELECT * FROM user_tables;--查詢當前使用者下所有的表格
SELECT * FROM user_constraints;--檢視當前使用者下所有的約束
SELECT * FROM user_cons_columns;--檢視約束關聯的列資訊
SELECT * FROM user_indexes;--查詢當前使用者下所有的索引
SELECT * FROM user_ind_columns;--檢視索引關聯的列資訊

五、

序列(sequence):按照一定的規則自動增長或自動減少,通常用於生成主鍵值

--簡單建立
CREATE SEQUENCE seq_emp;

--複雜建立
CREATE SEQUENCE seq_emp
MINVALUE 1             --最小值
MAXVALUE 9999999999999999999999999999     --最大值 maxvalue n| nomaxvalue 沒有最大值
START WITH 1                              --開始值
INCREMENT BY 1                            --原增的值
NOCYCLE                                   --預設不迴圈,cycle | nocycle
CACHE 20;                                 --預設快取20


CREATE SEQUENCE seq_dept
MINVALUE 10
MAXVALUE 90
START WITH 10
INCREMENT BY 10
NOCYCLE
NOCACHE;

--兩個屬性
--   nextval : 獲取序列的下一個值
--   currval :獲取同一個會話中,序列的當前的值,且取值之前必須先執行nextval取下一個值
SELECT seq_emp.nextval FROM dual;
SELECT seq_emp.currval FROM dual;

--使用序列:新增資料時,自動生成主鍵值
INSERT INTO emp(empno, ename, job) VALUES(seq_emp.nextval, '張三', 'SALSMAN');
SELECT * FROM emp;

--修改序列:除了START WITH以外的屬性均可以修改
1.將seq_dept的最大值修改為200
ALTER SEQUENCE seq_dept
MAXVALUE 200

--刪除序列
DROP SEQUENCE seq_emp;

六、

建立同義詞(SYSNONYM):給物件取別名
建立同義詞的語法如下:
CREATE [PUBLIC] SYNONYM 同義詞 FOR 表名;

1.為表emp建立私有同義詞e
CREATE SYNONYM e FOR emp;
SELECT * FROM e;--這時通過同義詞e便可以訪問表emp了
--其它使用者可以通過以下方式訪問scott的e
SELECT * FROM scott.e;

2.為dept表建立共有同義詞d
CREATE PUBLIC SYNONYM d FOR dept;
--其它使用者可以直接訪問e
SELECT * FROM d;

3.刪除同義詞
DROP SYNONYM e;
DROP PUBLIC SYNONYM d;