目錄
一、Oracle 視圖(Views)
(一) Oracle 視圖特點
(二)Oracle 視圖創建語法
關鍵參數:
(三)Oracle 視圖類型
1、普通視圖
2、連接視圖(可更新)
3、對象視圖
4、物化視圖(Materialized Views)
(四) Oracle 視圖數據字典
(五)Oracle 可更新視圖規則
(六)視圖的優缺點
1、視圖的優點:
2、視圖的缺點:
3、視圖和表的區別
二、Oracle 序列(Sequences)
(一)Oracle 序列特點
(二)Oracle 序列創建語法
重要參數:
(三)Oracle 序列操作
1、基本使用
2、修改序列
3、刪除序列
(四)Oracle 序列數據字典
(五)Oracle 序列高級特性
1、緩存優化
2、循環序列
3、會話級序列(RAC環境)
(六)Oracle 12c+ 序列增強
1、標識列(IDENTITY)
2、默認序列值
三、Oracle 特有功能
(一)物化視圖(Materialized Views)
1、創建刷新物化視圖
2、物化視圖日志
3、快速刷新
(二)序列與觸發器結合
(三)視圖與PL/SQL集成
四、Oracle 最佳實踐
(一)視圖最佳實踐
(二)序列最佳實踐
五、常見問題解決方案
(一)視圖問題
問題1:視圖變無效
問題2:視圖性能差
(二)序列問題
問題1:序列緩存丟失
問題2:序列達到MAXVALUE
問題3:需要重置序列
六、Oracle 20c/21c 新特性
(一)視圖增強
SQL宏視圖:
JSON關系視圖:
(二)序列增強
一、Oracle 視圖(Views)
(一) Oracle 視圖特點
Oracle 視圖具有以下獨特特性:
-
1. 強大的安全控制:可通過視圖實現行級和列級安全
-
2. 優化器集成:Oracle 優化器能對視圖查詢進行高級優化
-
3. 視圖約束:支持在視圖上定義約束
-
4. 對象視圖:可以基于對象類型創建視圖
-
5. 物化視圖:Oracle 特有的高性能視圖類型
-
·視圖名一般以v開頭
·可以設置成只讀模式 with read only
·修改視圖相當于對原表進行修改
!!!!!在工作中一般禁止用視圖修改原表!!!!!!
占的空間小,保密性高
(二)Oracle 視圖創建語法
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [schema.]view_name
[(column1, column2, ...)]
AS subquery
[WITH {CHECK OPTION [CONSTRAINT constraint_name] | READ ONLY | CONSTRAINT constraint_name}];create{or replace(有的話覆蓋先前)} view 視圖名 as select語句{with read only---設置成只讀}
關鍵參數:
-
FORCE
:即使基表不存在也創建視圖 -
NOFORCE
:默認,基表必須存在 -
WITH CHECK OPTION
:確保通過視圖的DML操作滿足視圖條件 -
READ ONLY
:禁止通過視圖進行DML操作
(三)Oracle 視圖類型
1、普通視圖
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.last_name, e.salary, d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
2、連接視圖(可更新)
CREATE VIEW emp_dept_updatable AS
SELECT e.employee_id, e.last_name, e.salary, e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location_id = 1700
WITH CHECK OPTION CONSTRAINT emp_dept_check;
3、對象視圖
CREATE TYPE emp_obj AS OBJECT (emp_id NUMBER,emp_name VARCHAR2(100),salary NUMBER
);CREATE VIEW emp_obj_view OF emp_obj
AS SELECT employee_id, last_name, salary FROM employees;
4、物化視圖(Materialized Views)
CREATE MATERIALIZED VIEW mv_emp_summary
REFRESH COMPLETE ON DEMAND
AS SELECT department_id, COUNT(*) emp_count, AVG(salary) avg_salFROM employeesGROUP BY department_id;
(四) Oracle 視圖數據字典
查看視圖信息:
-- 用戶視圖定義
SELECT * FROM USER_VIEWS WHERE VIEW_NAME = 'EMP_DEPT_VIEW';-- 視圖依賴關系
SELECT * FROM USER_DEPENDENCIES WHERE NAME = 'EMP_DEPT_VIEW';-- 視圖列信息
SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMP_DEPT_VIEW';
(五)Oracle 可更新視圖規則
Oracle 允許在以下條件下通過視圖進行DML操作:
-
視圖不包含集合操作(UNION, INTERSECT等)
-
不包含GROUP BY, CONNECT BY, START WITH子句
-
不包含聚合函數
-
不包含DISTINCT
-
不包含ROWNUM偽列
-
涉及的所有表必須具有主鍵約束
(六)視圖的優缺點
1、視圖的優點:
(1)使用視圖,可以定制用戶數據,聚焦特定數據
(2)使用視圖,可以簡化數據
(3)使用時圖,對基表中的數據有一定的安全性
(4)使用視圖,可以合并分離的數據,創建分區視圖
2、視圖的缺點:
(1)性能差
(2)修改限制
3、視圖和表的區別
(1)視圖是已經編譯好的sql語句,而表不是
(2)視圖沒有實際的物理記錄,而表有
(3)表是內容,視圖是窗口
(4)表只用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在
? ? ? ? ?表可以及時對他修改,但視圖只能由創建語句來修改
(5)表是內模式,視圖是外模式
(6)視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,
? ? ? ? ?只是一些sql語句的集合,從安全角度說,試圖可以不給用戶接觸數據表,從而不知道表結構
(7)表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表
(8)視圖的建立和刪除只影響視圖本身,不影響對應的基表
二、Oracle 序列(Sequences)
(一)Oracle 序列特點
Oracle 序列提供以下特性:
-
1、高性能:序列值緩存于內存,減少磁盤I/O
-
2、事務安全:序列值生成不受事務回滾影響
-
3、可配置性:靈活控制序列行為
-
4、不連續保證:可能產生間隙,不適合嚴格連續場景
(二)Oracle 序列創建語法
CREATE SEQUENCE [schema.]sequence_name[INCREMENT BY increment][START WITH start][MAXVALUE maxvalue | NOMAXVALUE][MINVALUE minvalue | NOMINVALUE][CYCLE | NOCYCLE][CACHE cache_size | NOCACHE][ORDER | NOORDER][SESSION | GLOBAL];數據庫中一個特殊存放等差數列的表。
主要用于提供主鍵值。
create sequence 序列名
start with 數1 --從幾開始
maxvalue 數2 --最大值,到幾結束
{minvalue 數3/nominvalue} --最小值,不寫每個最小值默認1
increment by 數4 --一次增加幾。等差,步長
cache/nocache 數5 --緩存值,提前運行多少次放在內存里。不寫默認20--緩存值(類似于看視頻提前緩存)--默認20, 必須小于循環次數即:cache<maxvalue
cycle/nocycle --是否循環。默認不循環
select 序列名.nextval from dual;---下一個值
select 序列名.currval from dual;---當前值
重要參數:
-
CACHE
:默認20,建議高并發系統增大緩存 -
ORDER
:確保序列值按請求順序生成(僅RAC環境需要) -
SESSION
/GLOBAL
:序列作用域(僅RAC環境)
(三)Oracle 序列操作
1、基本使用
-- 獲取下一個值
SELECT sequence_name.NEXTVAL FROM dual;-- 獲取當前值(不遞增)
SELECT sequence_name.CURRVAL FROM dual;-- 在DML中使用
INSERT INTO orders(order_id, ...)
VALUES (order_seq.NEXTVAL, ...);
2、修改序列
ALTER SEQUENCE sequence_name[INCREMENT BY increment][MAXVALUE maxvalue | NOMAXVALUE][MINVALUE minvalue | NOMINVALUE][CYCLE | NOCYCLE][CACHE cache_size | NOCACHE][ORDER | NOORDER];
注意:不能修改START WITH值,必須刪除重建
3、刪除序列
DROP SEQUENCE sequence_name;
(四)Oracle 序列數據字典
-- 用戶序列信息
SELECT * FROM USER_SEQUENCES;-- 序列權限
SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'SEQUENCE_NAME';
(五)Oracle 序列高級特性
1、緩存優化
CREATE SEQUENCE high_perf_seq
CACHE 100; -- 適合高并發系統
2、循環序列
CREATE SEQUENCE cyclic_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE;
3、會話級序列(RAC環境)
CREATE SEQUENCE session_seq
SESSION; -- 每個會話有獨立序列值
(六)Oracle 12c+ 序列增強
1、標識列(IDENTITY)
Oracle 12c引入了類似自增列的語法:
CREATE TABLE orders (order_id NUMBER GENERATED ALWAYS AS IDENTITY,order_date DATE,...
);
2、默認序列值
CREATE TABLE employees (emp_id NUMBER DEFAULT emp_seq.NEXTVAL,...
);
三、Oracle 特有功能
(一)物化視圖(Materialized Views)
1、創建刷新物化視圖
CREATE MATERIALIZED VIEW mv_sales_monthly
REFRESH COMPLETE ON DEMAND
ENABLE QUERY REWRITE
AS SELECT TRUNC(sale_date, 'MONTH') AS month,product_id,SUM(amount) AS total_amountFROM salesGROUP BY TRUNC(sale_date, 'MONTH'), product_id;
2、物化視圖日志
CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE(amount, sale_date, product_id)
INCLUDING NEW VALUES;
3、快速刷新
CREATE MATERIALIZED VIEW mv_sales_daily
REFRESH FAST ON COMMIT
AS SELECT TRUNC(sale_date) AS day,product_id,SUM(amount) AS total_amountFROM salesGROUP BY TRUNC(sale_date), product_id;
(二)序列與觸發器結合
CREATE OR REPLACE TRIGGER trg_emp_id
BEFORE INSERT ON employees
FOR EACH ROW
BEGINIF :NEW.employee_id IS NULL THEN:NEW.employee_id := emp_seq.NEXTVAL;END IF;
END;
/
(三)視圖與PL/SQL集成
CREATE OR REPLACE VIEW emp_dept_plsql AS
SELECT e.*, d.department_name,CASE WHEN e.salary > 10000 THEN 'High'WHEN e.salary > 5000 THEN 'Medium'ELSE 'Low' END AS salary_grade
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
四、Oracle 最佳實踐
(一)視圖最佳實踐
-
命名規范:使用
V_
前綴(如V_EMP_DEPT
) -
安全控制:通過視圖限制敏感數據訪問
-
性能監控:定期檢查視圖執行計劃
-
注釋文檔:為視圖添加注釋說明
COMMENT ON VIEW v_emp_dept IS 'Employee with department information';
-
避免過度嵌套:限制視圖嵌套層級(建議不超過3層
(二)序列最佳實踐
-
緩存設置:生產環境建議CACHE >= 20
-
命名規范:使用
SEQ_
前綴(如SEQ_ORDER_ID
) -
監控使用:定期檢查序列接近MAXVALUE情況
SELECT sequence_name, last_number, max_value FROM user_sequences WHERE last_number/max_value > 0.9;
-
RAC環境:使用ORDER序列確保全局順序
-
避免循環:生產環境慎用CYCLE選項
五、常見問題解決方案
(一)視圖問題
問題1:視圖變無效
-- 重新編譯無效視圖
ALTER VIEW view_name COMPILE;-- 查找所有無效視圖
SELECT object_name FROM user_objects
WHERE object_type = 'VIEW' AND status = 'INVALID';
問題2:視圖性能差
-- 添加提示(Hint)
CREATE OR REPLACE VIEW v_fast_emp AS
SELECT /*+ INDEX(e emp_dept_idx) */ e.*, d.department_name
FROM employees e JOIN departments d ON e.department_id = d.department_id;
(二)序列問題
問題1:序列緩存丟失
-- 增大緩存減少問題
ALTER SEQUENCE seq_name CACHE 100;
問題2:序列達到MAXVALUE
-- 修改序列(需要足夠權限)
ALTER SEQUENCE seq_name MAXVALUE 999999999999;-- 或創建新序列
CREATE SEQUENCE seq_name_new START WITH 1000000;
問題3:需要重置序列
-- 使用以下PL/SQL過程重置序列
DECLAREv_nextval NUMBER;
BEGINEXECUTE IMMEDIATE 'ALTER SEQUENCE seq_name INCREMENT BY -999999';SELECT seq_name.NEXTVAL INTO v_nextval FROM dual;EXECUTE IMMEDIATE 'ALTER SEQUENCE seq_name INCREMENT BY 1';
END;
/
六、Oracle 20c/21c 新特性
(一)視圖增強
-
SQL宏視圖:
CREATE OR REPLACE VIEW v_emp_dept_macro AS SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments);
-
JSON關系視圖:
CREATE OR REPLACE VIEW v_json_emp
AS SELECT e.employee_id, JSON_OBJECT('name' VALUE e.last_name, 'salary' VALUE e.salary) AS emp_dataFROM employees e;
(二)序列增強
-
SCALABLE序列(21c):
CREATE SEQUENCE seq_scalable SCALE EXTEND; -- 生成更短的唯一ID,適合分布式環境
-
會話級序列默認值:
CREATE TABLE session_orders (id NUMBER DEFAULT ON NULL seq_session.NEXTVAL,... );