Oracle 数据库高级操作说明
1. 高级 SQL 操作
1.1 子查询
子查询是嵌套在另一个查询中的查询,常用于复杂的查询场景。
单行子查询:
SELECT first_name, last_name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
多行子查询:
SELECT first_name, last_name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
1.2 连接查询
内连接:
SELECT e.first_name, e.last_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
外连接:
SELECT e.first_name, e.last_name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id;
1.3 集合操作
UNION:
SELECT first_name FROM employees UNION SELECT first_name FROM contractors;
INTERSECT:
SELECT first_name FROM employees INTERSECT SELECT first_name FROM contractors;
MINUS:
SELECT first_name FROM employees MINUS SELECT first_name FROM contractors;
2. PL/SQL 编程
2.1 PL/SQL 块
PL/SQL 是 Oracle 的过程化语言扩展,允许在数据库中编写存储过程、函数和触发器。
- 匿名块:
DECLARE v_name VARCHAR2(50); BEGIN SELECT first_name INTO v_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_name); END;
2.2 存储过程
创建存储过程:
CREATE OR REPLACE PROCEDURE get_employee_name (p_employee_id IN NUMBER, p_name OUT VARCHAR2) AS BEGIN SELECT first_name INTO p_name FROM employees WHERE employee_id = p_employee_id; END;
调用存储过程:
DECLARE v_name VARCHAR2(50); BEGIN get_employee_name(100, v_name); DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_name); END;
2.3 函数
创建函数:
CREATE OR REPLACE FUNCTION get_employee_salary (p_employee_id IN NUMBER) RETURN NUMBER AS v_salary NUMBER; BEGIN SELECT salary INTO v_salary FROM employees WHERE employee_id = p_employee_id; RETURN v_salary; END;
调用函数:
SELECT get_employee_salary(100) FROM dual;
2.4 触发器
- 创建触发器:
CREATE OR REPLACE TRIGGER before_employee_insert BEFORE INSERT ON employees FOR EACH ROW BEGIN :NEW.hire_date := SYSDATE; END;
3. 高级备份与恢复
3.1 增量备份
- 增量备份:
rman target / RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
3.2 点时间恢复
- 点时间恢复:
rman target / RMAN> RUN { SET UNTIL TIME "TO_DATE('2023-10-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')"; RESTORE DATABASE; RECOVER DATABASE; }
4. 数据仓库与分区
4.1 数据仓库
- 创建数据仓库表:
CREATE TABLE sales_fact ( sale_id NUMBER, sale_date DATE, product_id NUMBER, quantity NUMBER, amount NUMBER ) PARTITION BY RANGE (sale_date) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) );
4.2 分区表维护
添加分区:
ALTER TABLE sales_fact ADD PARTITION p3 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'));
合并分区:
ALTER TABLE sales_fact MERGE PARTITIONS p1, p2 INTO PARTITION p1_p2;
5. 高级性能优化
5.1 索引优化
创建位图索引:
CREATE BITMAP INDEX idx_employee_gender ON employees(gender);
创建函数索引:
CREATE INDEX idx_employee_upper_name ON employees(UPPER(last_name));
5.2 并行查询
- 启用并行查询:
ALTER SESSION ENABLE PARALLEL DML; SELECT /*+ PARALLEL(employees, 4) */ * FROM employees;
5.3 物化视图
创建物化视图:
CREATE MATERIALIZED VIEW mv_employee_salary AS SELECT department_id, AVG(salary) avg_salary FROM employees GROUP BY department_id;
刷新物化视图:
EXEC DBMS_MVIEW.REFRESH('mv_employee_salary');
6. 高级安全管理
6.1 数据加密
- 透明数据加密 (TDE):
ALTER TABLE employees MODIFY (salary ENCRYPT);
6.2 虚拟私有数据库 (VPD)
- 创建 VPD 策略:
BEGIN DBMS_RLS.ADD_POLICY( object_schema => 'hr', object_name => 'employees', policy_name => 'emp_policy', function_schema => 'hr', policy_function => 'emp_policy_func', statement_types => 'SELECT, INSERT, UPDATE, DELETE' ); END;
6.3 审计增强
- 细粒度审计:
BEGIN DBMS_FGA.ADD_POLICY( object_schema => 'hr', object_name => 'employees', policy_name => 'audit_emp_salary', audit_condition => 'salary > 10000', audit_column => 'salary' ); END;
7. 高级监控与诊断
7.1 AWR 报告
- 生成 AWR 报告:
@?/rdbms/admin/awrrpt.sql
7.2 ADDM 报告
- 生成 ADDM 报告:
@?/rdbms/admin/addmrpt.sql
7.3 SQL 调优顾问
- 使用 SQL 调优顾问:
DECLARE task_name VARCHAR2(30); BEGIN task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'abc123'); DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name); END;
8. 结论
通过掌握这些高级操作,您可以更有效地管理和优化 Oracle 数据库,满足复杂的企业级应用需求。无论是复杂的 SQL 查询、PL/SQL 编程、高级备份与恢复,还是性能优化和安全管理,Oracle 提供了丰富的工具和功能来支持您的数据库管理工作。