Oracle筆記16——Oracle序列、索引與同義詞
阿新 • • 發佈:2021-11-11
一、
索引(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;