Oracle 数据库从入门到醒目(2025最新版)

打印 上一主题 下一主题

主题 1599|帖子 1599|积分 4797

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Oracle 数据库从入门到醒目(2025最新版)


  
一、Oracle 数据库基础

1.1 Oracle 数据库概述

1.1.1 界说与特点

Oracle 数据库是由甲骨文(Oracle)公司开辟的一款关系型数据库管理系统(RDBMS),在企业级应用领域具有广泛的应用。它具有以下显著特点:


  • 高度可扩展性:支持从单用户的桌面应用到大型分布式企业级应用的扩展,能够处置惩罚海量数据和高并发的业务需求。
  • 强大的安全性:提供了多层次的安全机制,包罗用户认证、授权、数据加密、审计等功能,确保数据的安全性和完整性。
  • 高可用性:具备多种高可用方案,如数据守护(Data Guard)、实时应用集群(RAC)等,能够包管在硬件故障、软件故障等情况下数据的可用性和业务的连续性。
  • 兼容性和开放性:支持标准 SQL 语言,同时兼容多种操纵系统和硬件平台,而且提供了丰富的开辟接口和工具,方便与其他系统举行集成。
  • 强大的数据分析能力:提供了高级的数据分析功能,如数据挖掘、联机分析处置惩罚(OLAP)等,资助企业从海量数据中提取有价值的信息。
1.1.2 应用场景

Oracle 数据库广泛应用于金融、电信、政府、医疗、制造业等多个行业,常见的应用场景包罗:


  • 企业资源规划(ERP)系统:管理企业的财政、人力资源、供应链等焦点业务流程,确保企业资源的高效利用。
  • 客户关系管理(CRM)系统:跟踪和管理客户信息、销售机会、客户服务等,提高客户满意度和忠诚度。
  • 电子商务平台:处置惩罚大量的交易数据和用户信息,确保交易的安全和高效举行。
  • 数据仓库和商业智能(BI)系统:存储和分析企业的汗青数据,为企业决策提供支持。
1.2 安装与设置

1.2.1 安装步骤



  • Windows 系统

    • 从 Oracle 官方网站下载适合 Windows 系统的 Oracle 数据库安装包。
    • 运行安装程序,按照安装向导的提示举行操纵。在安装过程中,必要选择安装类型(如企业版、标准版等)、设置数据库实例名、系统管理员(SYSDBA)密码等信息。
    • 安装完成后,Oracle 数据库会自动创建一个默认的数据库实例,并启动相关的服务。

  • Linux 系统(以 Oracle Linux 为例)

    • 以 root 用户登录系统,创建一个平凡用户(如 oracle)用于安装和管理 Oracle 数据库,并为其设置密码。

  1. useradd oracle
  2. passwd oracle
复制代码

  • 下载 Oracle 数据库的 Linux 安装包,并将其上传到服务器上。
  • 解压安装包:
  1. unzip linuxx64_19c_database.zip
复制代码

  • 切换到 oracle 用户,运行安装脚本:
  1. su - oracle
  2. ./database/runInstaller
复制代码

  • 按照安装向导的提示举行操纵,选择安装类型、设置数据库实例名、系统管理员密码等信息。
  • 安装完成后,必要实行 root 脚本以完成安装设置:
  1. su - root
  2. /oracle/oraInventory/orainstRoot.sh
  3. /oracle/product/19.0.0/dbhome_1/root.sh
复制代码
1.2.2 设置文件

Oracle 数据库的告急设置文件包罗 init.ora 或 spfile.ora,以及 tnsnames.ora 等。


  • init.ora 或 spfile.ora:用于设置数据库实例的各种参数,如内存分配、日记管理、字符集等。可以使用 SQL*Plus 等工具修改这些参数。
  1. -- 修改参数并立即生效
  2. ALTER SYSTEM SET parameter_name = value SCOPE = BOTH;
复制代码


  • tnsnames.ora:用于设置客户端连接数据库的网络服务名,界说了数据库的连接信息,如主机名、端口号、服务名等。
  1. ORCL =
  2.   (DESCRIPTION =
  3.     (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521))
  4.     (CONNECT_DATA =
  5.       (SERVER = DEDICATED)
  6.       (SERVICE_NAME = orcl)
  7.     )
  8.   )
复制代码
1.3 根本概念

1.3.1 数据库

Oracle 数据库是一个逻辑上的概念,由数据文件、控制文件、联机日记文件等物理文件组成。一个 Oracle 数据库可以包含多个表空间。
1.3.2 表空间

表空间是 Oracle 数据库的逻辑存储单位,用于组织和管理数据文件。一个数据库可以包含多个表空间,常见的表空间类型有系统表空间(SYSTEM)、用户表空间(USERS)、临时表空间(TEMP)等。


  • 系统表空间(SYSTEM):存储数据库的系统元数据,如表结构、索引信息、用户权限等,是数据库正常运行必不可少的表空间。
  • 用户表空间(USERS):用于存储用户创建的表、索引等数据,是用户数据的告急存储地区。
  • 临时表空间(TEMP):在实行排序、连接等操纵时,用于临时存储中间结果,操纵完成后临时数据会被自动清除。
1.3.3 数据文件

数据文件是物理存储单位,用于存储表空间中的数据。一个表空间可以包含一个或多个数据文件,数据文件以二进制文件的情势存储在磁盘上。
1.3.4 表

表是数据库中存储数据的根本结构,由行和列组成。每一列界说了数据的属性,具有特定的数据类型。可以通过 SQL 语句创建、修改和删除表。
1.3.5 字段

表中的列也称为字段,用于描述数据的某个特征或属性。每个字段都有一个名称和数据类型,数据类型决定了该字段可以存储的数据范围和格式。
1.3.6 记录

表中的一行数据称为一条记录,包含了各个字段的值。记录是数据库中数据存储和操纵的根本单位。
1.3.7 数据类型

Oracle 数据库支持多种数据类型,常见的数据类型包罗:


  • 数值类型:如 NUMBER(可以存储整数和小数)、INTEGER(整数类型)等,用于存储数值数据。
  • 字符类型:如 CHAR(定长字符类型)、VARCHAR2(变长字符类型)、CLOB(大字符对象类型)等,用于存储文本数据。
  • 日期和时间类型:如 DATE(日期时间类型)、TIMESTAMP(时间戳类型)等,用于存储日期和时间信息。
  • 二进制类型:如 RAW(二进制数据类型)、BLOB(二进制大对象类型)等,用于存储二进制数据。
1.4 SQL 基础

1.4.1 数据库操纵



  • 创建表空间
  1. CREATE TABLESPACE tablespace_name
  2. DATAFILE 'datafile_path' SIZE 100M;
复制代码


  • 删除表空间
  1. DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
复制代码


  • 创建用户
  1. CREATE USER user_name
  2. IDENTIFIED BY password
  3. DEFAULT TABLESPACE tablespace_name
  4. TEMPORARY TABLESPACE temp_tablespace_name;
复制代码


  • 授权
  1. GRANT CREATE SESSION, CREATE TABLE TO user_name;
复制代码


  • 切换用户:使用 SQL*Plus 工具登录不同的用户。
  1. sqlplus user_name/password@service_name
复制代码
1.4.2 表操纵



  • 创建表
  1. CREATE TABLE table_name (
  2.     column1 datatype constraint,
  3.     column2 datatype constraint,
  4.     ...
  5. );
复制代码
例如:
  1. CREATE TABLE employees (
  2.     emp_id NUMBER PRIMARY KEY,
  3.     emp_name VARCHAR2(50) NOT NULL,
  4.     emp_age NUMBER,
  5.     emp_department VARCHAR2(50)
  6. );
复制代码


  • 删除表
  1. DROP TABLE table_name;
复制代码


  • 修改表结构

    • 添加列

  1. ALTER TABLE table_name ADD column_name datatype;
复制代码


  • 删除列
  1. ALTER TABLE table_name DROP COLUMN column_name;
复制代码


  • 修改列的数据类型
  1. ALTER TABLE table_name MODIFY column_name new_datatype;
复制代码
1.4.3 数据操纵



  • 插入数据
  1. INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
复制代码
例如:
  1. INSERT INTO employees (emp_id, emp_name, emp_age, emp_department) VALUES (1, 'John Doe', 30, 'IT');
复制代码


  • 查询数据
  1. SELECT column1, column2, ... FROM table_name WHERE condition;
复制代码
例如:
  1. SELECT * FROM employees WHERE emp_age > 25;
复制代码


  • 更新数据
  1. UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
复制代码
例如:
  1. UPDATE employees SET emp_age = 31 WHERE emp_id = 1;
复制代码


  • 删除数据
  1. DELETE FROM table_name WHERE condition;
复制代码
例如:
  1. DELETE FROM employees WHERE emp_id = 1;
复制代码
1.4.4 数据排序与分页



  • 排序
  1. SELECT * FROM table_name ORDER BY column_name [ASC|DESC];
复制代码
例如:
  1. SELECT * FROM employees ORDER BY emp_age DESC;
复制代码


  • 分页:在 Oracle 中可以使用 ROWNUM 实现分页查询。
  1. SELECT * FROM (
  2.     SELECT ROWNUM AS rn, t.* FROM (
  3.         SELECT * FROM employees WHERE emp_age > 25 ORDER BY emp_age
  4.     ) t WHERE ROWNUM <= 20
  5. ) WHERE rn >= 11;
复制代码
1.5 束缚

1.5.1 主键束缚(PRIMARY KEY)

主键是表中唯一标识每条记录的字段或字段组合,一个表只能有一个主键。主键束缚确保主键字段的值唯一且不为空。
  1. CREATE TABLE products (
  2.     product_id NUMBER PRIMARY KEY,
  3.     product_name VARCHAR2(100)
  4. );
复制代码
1.5.2 唯一束缚(UNIQUE)

唯一束缚确保字段的值唯一,但可以为空。一个表可以有多个唯一束缚。
  1. CREATE TABLE customers (
  2.     customer_id NUMBER,
  3.     customer_email VARCHAR2(100) UNIQUE,
  4.     customer_name VARCHAR2(50)
  5. );
复制代码
1.5.3 非空束缚(NOT NULL)

非空束缚确保字段的值不为空。
  1. CREATE TABLE orders (
  2.     order_id NUMBER,
  3.     order_date DATE NOT NULL,
  4.     order_amount NUMBER(10, 2)
  5. );
复制代码
1.5.4 外键束缚(FOREIGN KEY)

外键用于创建两个表之间的关联关系,确保一个表中的字段值必须存在于另一个表的主键字段中。
  1. CREATE TABLE order_items (
  2.     item_id NUMBER PRIMARY KEY,
  3.     order_id NUMBER,
  4.     product_id NUMBER,
  5.     quantity NUMBER,
  6.     FOREIGN KEY (order_id) REFERENCES orders(order_id),
  7.     FOREIGN KEY (product_id) REFERENCES products(product_id)
  8. );
复制代码
二、Oracle 数据库进阶

2.1 高级 SQL

2.1.1 连接查询



  • 内连接(INNER JOIN):返回两个表中满意连接条件的行。
  1. SELECT * FROM orders
  2. JOIN customers ON orders.customer_id = customers.customer_id;
复制代码


  • 左连接(LEFT JOIN):返回左表中的所有行,以及右表中满意连接条件的行。
  1. SELECT * FROM customers
  2. LEFT JOIN orders ON customers.customer_id = orders.customer_id;
复制代码


  • 右连接(RIGHT JOIN):返回右表中的所有行,以及左表中满意连接条件的行。
  1. SELECT * FROM orders
  2. RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
复制代码


  • 全连接(FULL OUTER JOIN):返回两个表中的所有行,无论是否满意连接条件。
  1. SELECT * FROM customers
  2. FULL OUTER JOIN orders ON customers.customer_id = orders.customer_id;
复制代码
2.1.2 子查询

子查询是在一个查询中嵌套另一个查询,子查询可以出现在 WHERE 子句、FROM 子句、SELECT 子句等位置。


  • 在 WHERE 子句中使用子查询
  1. SELECT * FROM employees WHERE emp_salary > (SELECT AVG(emp_salary) FROM employees);
复制代码


  • 在 FROM 子句中使用子查询
  1. SELECT subquery.avg_salary FROM (SELECT AVG(emp_salary) AS avg_salary FROM employees) subquery;
复制代码
2.1.3 分组和聚合函数



  • 分组:使用 GROUP BY 子句对数据举行分组。
  1. SELECT department, COUNT(*) FROM employees GROUP BY department;
复制代码


  • 聚合函数:常用的聚合函数有 COUNT、SUM、AVG、MAX、MIN 等。
  1. SELECT SUM(emp_salary) FROM employees;
复制代码
2.1.4 窗口函数

窗口函数可以在查询结果的特定窗口内举行盘算,语法如下:
  1. function_name(expression) OVER (
  2.     [PARTITION BY partition_expression, ... ]
  3.     [ORDER BY sort_expression [ASC|DESC], ... ]
  4.     [frame_clause]
  5. )
复制代码
例如:
  1. SELECT
  2.     emp_id,
  3.     emp_salary,
  4.     AVG(emp_salary) OVER (PARTITION BY department) AS avg_department_salary
  5. FROM employees;
复制代码
2.2 索引

2.2.1 索引的作用

索引可以提高查询的效率,加速数据的检索速度。Oracle 数据库通过索引可以快速定位到符合条件的记录,减少全表扫描的开销。
2.2.2 索引类型



  • B - 树索引:最常用的索引类型,适用于等值查询和范围查询。
  1. CREATE INDEX idx_name ON employees (emp_name);
复制代码


  • 位图索引:适用于列值重复度高的情况,如性别、状态等列。
  1. CREATE BITMAP INDEX idx_gender ON employees (emp_gender);
复制代码


  • 函数索引:基于函数或表达式创建的索引,用于加速包含函数或表达式的查询。
  1. CREATE INDEX idx_upper_name ON employees (UPPER(emp_name));
复制代码
2.2.3 索引优化



  • 选择符合的索引字段:通常选择经常用于查询条件、排序和连接的字段作为索引字段。
  • 避免过多的索引:过多的索引会增加数据插入、更新和删除的开销,同时也会占用更多的磁盘空间。
  • 定期重修索引:随着数据的不断插入、更新和删除,索引大概会变得碎片化,定期重修索引可以提高索引的性能。
2.3 存储过程和函数

2.3.1 存储过程

存储过程是一组预编译的 SQL 语句,可以接受参数并实行一系列操纵。存储过程可以提高代码的复用性和实行效率。
  1. CREATE OR REPLACE PROCEDURE get_employees_by_department(
  2.     p_department IN VARCHAR2,
  3.     p_cursor OUT SYS_REFCURSOR
  4. )
  5. IS
  6. BEGIN
  7.     OPEN p_cursor FOR
  8.         SELECT * FROM employees WHERE emp_department = p_department;
  9. END;
复制代码
调用存储过程:
  1. DECLARE
  2.     v_cursor SYS_REFCURSOR;
  3.     v_emp employees%ROWTYPE;
  4. BEGIN
  5.     get_employees_by_department('IT', v_cursor);
  6.     LOOP
  7.         FETCH v_cursor INTO v_emp;
  8.         EXIT WHEN v_cursor%NOTFOUND;
  9.         DBMS_OUTPUT.PUT_LINE(v_emp.emp_name);
  10.     END LOOP;
  11.     CLOSE v_cursor;
  12. END;
复制代码
2.3.2 函数

函数是返回一个值的 SQL 代码块,函数可以接受参数并返回一个结果。
  1. CREATE OR REPLACE FUNCTION get_employee_count RETURN NUMBER
  2. IS
  3.     v_count NUMBER;
  4. BEGIN
  5.     SELECT COUNT(*) INTO v_count FROM employees;
  6.     RETURN v_count;
  7. END;
复制代码
调用函数:
  1. SELECT get_employee_count() FROM DUAL;
复制代码
2.4 事件处置惩罚

2.4.1 事件的概念

事件是一组操纵,要么全部成功实行,要么全部回滚。事件具有四个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称 ACID 特性。
2.4.2 事件的使用

  1. -- 开始事务
  2. SET TRANSACTION;
  3. -- 执行一系列 SQL 操作
  4. INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
  5. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
  6. -- 提交事务
  7. COMMIT;
复制代码
2.4.2 事件的使用(续)

  1. -- 或者回滚事务
  2. ROLLBACK;
复制代码
在 Oracle 中,事件开始于第一条可实行的 SQL 语句,直到遇到 COMMIT 或 ROLLBACK 语句竣事。COMMIT 语句将事件中所做的所有更改永世生存到数据库中,而 ROLLBACK 语句则撤销事件中所做的所有更改。
2.4.3 事件的隔离级别

Oracle 支持两种告急的事件隔离级别:


  • 读已提交(READ COMMITTED):这是 Oracle 的默认隔离级别。在该级别下,一个事件只能读取另一个事件已经提交的数据,避免了脏读题目。每次查询时,Oracle 会根据当前时间点的数据快照举行读取,不同的查询大概会读取到不同版本的数据,因此大概会出现不可重复读和幻读题目。
  1. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
复制代码


  • 可串行化(SERIALIZABLE):该隔离级别提供了最高的事件隔离性。在可串行化事件中,事件的实行就像它们是串行实行的一样,避免了脏读、不可重复读和幻读题目。但这种隔离级别会降低并发性能,因为它会对读取的数据加锁,阻止其他事件对这些数据举行修改。
  1. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
复制代码
2.5 数据库管理

2.5.1 用户管理



  • 创建用户
  1. CREATE USER new_user
  2. IDENTIFIED BY password
  3. DEFAULT TABLESPACE users
  4. TEMPORARY TABLESPACE temp;
复制代码


  • 授权
  1. -- 授予基本权限
  2. GRANT CREATE SESSION, CREATE TABLE TO new_user;
  3. -- 授予系统级权限
  4. GRANT ALTER ANY TABLE TO new_user;
  5. -- 授予对象级权限
  6. GRANT SELECT ON employees TO new_user;
复制代码


  • 撤销权限
  1. REVOKE SELECT ON employees FROM new_user;
复制代码


  • 删除用户
  1. DROP USER new_user CASCADE;
复制代码
CASCADE 选项会删除该用户所拥有的所有对象。
2.5.2 备份与恢复



  • 逻辑备份与恢复

    • 导出(EXPDP):使用数据泵导出工具可以将数据库对象和数据导出到转储文件中。

  1. expdp system/password directory=dpump_dir dumpfile=backup.dmp tables=employees
复制代码


  • 导入(IMPDP):使用数据泵导入工具可以将转储文件中的数据和对象导入到数据库中。
  1. impdp system/password directory=dpump_dir dumpfile=backup.dmp tables=employees
复制代码


  • 物理备份与恢复

    • 冷备份:在数据库关闭的状态下,备份数据库的数据文件、控制文件和联机日记文件。

  1. -- 关闭数据库
  2. sqlplus / as sysdba
  3. SHUTDOWN IMMEDIATE;
  4. -- 备份文件
  5. cp /u01/app/oracle/oradata/ORCL/* /backup_location/
  6. -- 启动数据库
  7. STARTUP;
复制代码


  • 热备份:在数据库运行的状态下,对表空间举行备份。必要先将表空间置于备份模式,然后备份数据文件,末了竣事备份模式。
  1. -- 开始备份
  2. ALTER TABLESPACE users BEGIN BACKUP;
  3. -- 备份数据文件
  4. cp /u01/app/oracle/oradata/ORCL/users01.dbf /backup_location/
  5. -- 结束备份
  6. ALTER TABLESPACE users END BACKUP;
复制代码


  • 恢复操纵:根据备份的类型和情况,使用相应的下令举行恢复。例如,使用 RMAN(Recovery Manager)工具可以举行更高效的物理备份和恢复操纵。
  1. rman target /
  2. RESTORE DATABASE;
  3. RECOVER DATABASE;
复制代码
2.5.3 性能优化



  • 查询优化

    • 使用 EXPLAIN PLAN 语句分析查询的实行筹划,相识查询是如何访问数据的,是否使用了索引等。

  1. EXPLAIN PLAN FOR
  2. SELECT * FROM employees WHERE emp_age > 30;
  3. SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
复制代码


  • 优化查询语句,避免使用 SELECT *,尽量只选择必要的列;避免在 WHERE 子句中对列举行函数运算,以免影响索引的使用。
  • 公道使用索引,根据查询条件和排序字段创建符合的索引。
  • 数据库设置优化

    • 根据服务器的硬件资源和业务需求,调整 init.ora 或 spfile.ora 中的设置参数,如 SGA_TARGET(系统全局区大小)、PGA_AGGREGATE_TARGET(程序全局区大小)等。
    • 公道规划表空间和数据文件的存储位置,避免 I/O 瓶颈。

  • 存储结构优化

    • 对大表举行分区,如范围分区、列表分区、哈希分区等,提高查询性能和数据管理效率。
    • 定期收集统计信息,使用 DBMS_STATS 包来更新表和索引的统计信息,资助优化器生成更优的实行筹划。

  1. EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'schema_name', tabname => 'table_name');
复制代码
2.6 视图

2.6.1 视图的概念

视图是一种虚拟表,它并不现实存储数据,而是基于 SQL 查询语句界说的。视图可以简化复杂的查询操纵,隐藏数据的复杂性,提高数据的安全性。
2.6.2 创建视图

  1. CREATE VIEW view_name AS
  2. SELECT column1, column2, ...
  3. FROM table_name
  4. WHERE condition;
复制代码
例如,创建一个包含员工姓名和部门的视图:
  1. CREATE VIEW employee_department_view AS
  2. SELECT emp_name, emp_department
  3. FROM employees;
复制代码
2.6.3 使用视图

可以像使用平凡表一样使用视图举行查询操纵:
  1. SELECT * FROM employee_department_view;
复制代码
2.6.4 修改和删除视图



  • 修改视图:使用 CREATE OR REPLACE VIEW 语句修改视图的界说。
  1. CREATE OR REPLACE VIEW view_name AS
  2. SELECT new_column1, new_column2, ...
  3. FROM table_name
  4. WHERE new_condition;
复制代码


  • 删除视图:使用 DROP VIEW 语句删除视图。
  1. DROP VIEW view_name;
复制代码
2.7 触发器

2.7.1 触发器的概念

触发器是一种特殊的存储过程,它会在特定的数据库操纵(如 INSERT、UPDATE、DELETE)之前或之后自动实行。触发器可以用于实现数据的完整性束缚、日记记录等功能。
2.7.2 创建触发器

  1. CREATE OR REPLACE TRIGGER trigger_name
  2. {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
  3. [FOR EACH ROW]
  4. BEGIN
  5.     -- 触发器执行的 SQL 语句
  6. END;
复制代码
例如,创建一个在插入员工记录后记录日记的触发器:
  1. CREATE OR REPLACE TRIGGER log_employee_insert
  2. AFTER INSERT ON employees
  3. FOR EACH ROW
  4. BEGIN
  5.     INSERT INTO employee_log (action, timestamp) VALUES ('INSERT', SYSDATE);
  6. END;
复制代码
2.7.3 触发器的类型



  • 行级触发器(FOR EACH ROW):针对每一行受影响的数据实行一次触发器代码。常用于实现行级的数据完整性束缚。
  • 语句级触发器:无论受影响的行数是多少,触发器代码只实行一次。常用于记录操纵日记等。
2.7.4 删除触发器

使用 DROP TRIGGER 语句删除触发器:
  1. DROP TRIGGER trigger_name;
复制代码
2.8 分区表

2.8.1 分区表的概念

分区表是将一个大表按照一定的规则分割成多个较小的子表,这些子表在物理上是分开存储的,但在逻辑上仍然是一个表。分区可以提高查询性能、便于数据管理和维护。
2.8.2 分区类型



  • 范围分区(RANGE Partitioning):根据列值的范围将数据划分到不同的分区中。例如,按照员工入职日期对员工表举行分区。
  1. CREATE TABLE employees (
  2.     emp_id NUMBER,
  3.     emp_name VARCHAR2(50),
  4.     hire_date DATE
  5. )
  6. PARTITION BY RANGE (hire_date) (
  7.     PARTITION p_2023 VALUES LESS THAN (TO_DATE('01 - 01 - 2024', 'DD - MM - YYYY')),
  8.     PARTITION p_2024 VALUES LESS THAN (TO_DATE('01 - 01 - 2025', 'DD - MM - YYYY'))
  9. );
复制代码


  • 列表分区(LIST Partitioning):根据列值的列表将数据划分到不同的分区中。例如,按照员工所在地区对员工表举行分区。
  1. CREATE TABLE employees (
  2.     emp_id NUMBER,
  3.     emp_name VARCHAR2(50),
  4.     region VARCHAR2(50)
  5. )
  6. PARTITION BY LIST (region) (
  7.     PARTITION p_north VALUES IN ('North', 'Northeast'),
  8.     PARTITION p_south VALUES IN ('South', 'Southeast')
  9. );
复制代码


  • 哈希分区(HASH Partitioning):根据列值的哈希值将数据匀称地分布到不同的分区中。常用于必要平均分配数据的场景。
  1. CREATE TABLE employees (
  2.     emp_id NUMBER,
  3.     emp_name VARCHAR2(50)
  4. )
  5. PARTITION BY HASH (emp_id)
  6. PARTITIONS 4;
复制代码


  • 组合分区:可以将范围分区、列表分区和哈希分区组合使用,以满意更复杂的业务需求。例如,范围 - 哈希分区。
2.8.3 分区表的长处和注意事项



  • 长处:提高查询性能,尤其是在处置惩罚大量数据时;便于数据的管理和维护,如数据的备份、归档和删除;可以并行处置惩罚分区数据,提高系统的并发性能。
  • 注意事项:分区键的选择非常告急,不公道的分区键大概会导致数据分布不匀称;分区表的维护相对复杂,必要注意分区的添加、删除和归并操纵。
2.9 Oracle 数据库监控与诊断

2.9.1 监控指标



  • 性能指标

    • CPU 使用率:通过操纵系统监控工具(如 top、vmstat 等)检察 Oracle 数据库进程的 CPU 使用率,过高的 CPU 使用率大概表现数据库存在复杂查询或性能瓶颈。
    • 内存使用率:监控数据库使用的内存大小,包罗系统全局区(SGA)和程序全局区(PGA),确保内存分配公道,避免内存不足导致的性能降落。
    • 磁盘 I/O 性能:使用 iostat 等工具监控磁盘的读写速度、I/O 等候时间等指标,判定磁盘是否成为性能瓶颈。
    • 网络带宽:监控数据库服务器的网络带宽使用情况,确保网络连接稳固,避免网络耽误影响数据库的性能。

  • 数据库指标

    • 会话数:检察当前数据库的会话连接数,过高的会话数大概导致性能降落,必要公道设置最大会话数。
    • 锁等候情况:监控数据库中的锁等候事件,实时发现并办理锁冲突题目,避免死锁的发生。
    • 事件吞吐量:统计数据库的事件处置惩罚速度,评估数据库的并发处置惩罚能力。

2.9.2 诊断工具



  • Enterprise Manager(EM):Oracle 提供的可视化管理工具,可以方便地监控数据库的各种状态信息、实行 SQL 语句、管理用户和权限等,还能举行性能调优和故障诊断。
  • AWR(Automatic Workload Repository):自动工作负载信息库,记录了数据库的性能统计信息,通过分析 AWR 报告可以找出数据库的性能瓶颈和题目。
  1. -- 生成 AWR 报告
  2. @?/rdbms/admin/awrrpt.sql
复制代码


  • ASH(Active Session History):活动会话汗青记录,提供了数据库中活动会话的详细信息,用于分析数据库的实时性能。
2.9.3 性能调优发起



  • 硬件层面:根据数据库的业务需求和数据量,公道设置服务器的 CPU、内存、磁盘等硬件资源,确保硬件性能满意数据库的运行要求。
  • 软件层面:优化数据库的设置参数,如调整 SGA_TARGET、PGA_AGGREGATE_TARGET 等参数;优化 SQL 语句,避免全表扫描和复杂的嵌套查询;定期维护数据库,如重修索引、收集统计信息等。
2.10 Oracle 数据库与其他系统的集成

2.10.1 与应用程序集成



  • Java 应用:可以使用 JDBC(Java Database Connectivity)驱动程序连接 Oracle 数据库,实现 Java 应用程序与数据库的交互。以下是一个简朴的 Java 示例代码:
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. public class OracleConnectionExample {
  6.     public static void main(String[] args) {
  7.         try {
  8.             // 加载 Oracle JDBC 驱动
  9.             Class.forName("oracle.jdbc.driver.OracleDriver");
  10.             // 建立数据库连接
  11.             Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "username", "password");
  12.             // 创建 Statement 对象
  13.             Statement stmt = conn.createStatement();
  14.             // 执行 SQL 查询
  15.             ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
  16.             // 处理查询结果
  17.             while (rs.next()) {
  18.                 System.out.println(rs.getString("emp_name"));
  19.             }
  20.             // 关闭资源
  21.             rs.close();
  22.             stmt.close();
  23.             conn.close();
  24.         } catch (Exception e) {
  25.             e.printStackTrace();
  26.         }
  27.     }
  28. }
复制代码


  • Python 应用:可以使用 cx_Oracle 库连接 Oracle 数据库。以下是一个简朴的 Python 示例代码:
  1. import cx_Oracle
  2. # 建立数据库连接
  3. conn = cx_Oracle.connect('username/password@localhost:1521/ORCL')
  4. # 创建游标对象
  5. cursor = conn.cursor()
  6. # 执行 SQL 查询
  7. cursor.execute("SELECT * FROM employees")
  8. # 获取查询结果
  9. results = cursor.fetchall()
  10. for row in results:
  11.     print(row[1])
  12. # 关闭游标和连接
  13. cursor.close()
  14. conn.close()
复制代码
2.10.2 与大数据平台集成



  • 与 Hadoop 集成:可以通过 Sqoop 工具实现 Oracle 数据库与 Hadoop 生态系统的集成。例如,使用 Sqoop 可以将 Oracle 数据库中的数据导入到 Hadoop 的 HDFS 中,或者将 HDFS 中的数据导出到 Oracle 数据库中。
  1. # 将 Oracle 数据库中的数据导入到 HDFS
  2. sqoop import \
  3. --connect jdbc:oracle:thin:@localhost:1521:ORCL \
  4. --username username \
  5. --password password \
  6. --table employees \
  7. --target-dir /user/hadoop/employees
复制代码


  • 与 Spark 集成:可以使用 Spark 的 JDBC 数据源将 Oracle 数据库中的数据加载到 Spark 中举行数据分析和处置惩罚。以下是一个简朴的 Spark Scala 示例代码:
  1. import org.apache.spark.sql.SparkSession
  2. object OracleSparkIntegration {
  3.   def main(args: Array[String]): Unit = {
  4.     val spark = SparkSession.builder()
  5.       .appName("OracleSparkIntegration")
  6.       .master("local[*]")
  7.       .getOrCreate()
  8.     val jdbcDF = spark.read
  9.       .format("jdbc")
  10.       .option("url", "jdbc:oracle:thin:@localhost:1521:ORCL")
  11.       .option("driver", "oracle.jdbc.driver.OracleDriver")
  12.       .option("dbtable", "employees")
  13.       .option("user", "username")
  14.       .option("password", "password")
  15.       .load()
  16.     jdbcDF.show()
  17.     spark.stop()
  18.   }
  19. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表