一、SQL语句根据其功能主要可以分为以下几大类:
1. 数据查询语言(DQL, Data Query Language)
- 功能:用于从数据库中检索数据,常用于查询表中的记录。
- 基本结构:主要由SELECT子句、FROM子句、WHERE子句等组成。
- 关键字:SELECT。
- 示例:SELECT 字段名 FROM 表名 WHERE 条件;
2. 数据操纵语言(DML, Data Manipulation Language)
- 功能:用于对数据库表中的数据进行增删改操作。
- 主要形式:
- 插入(INSERT):向表中添加新的记录。
- 更新(UPDATE):修改表中的已有记录。
- 删除(DELETE):从表中删除记录。
- 关键字:INSERT、UPDATE、DELETE。
- 示例:
- 插入:INSERT INTO 表名 (字段1, 字段2, …) VALUES (值1, 值2, …);
- 更新:UPDATE 表名 SET 字段名 = 新值 WHERE 条件;
- 删除:DELETE FROM 表名 WHERE 条件;
二、Oracle执行一条SQL的内部过程
Oracle数据库执行一条SQL语句的内部过程是一个复杂而精细的操作,它涉及多个组件和步骤的协同工作。虽然具体实现细节可能会随着Oracle数据库版本的不同而有所变化,但下面是一个简化和通用的过程描述,涵盖了从SQL语句提交到结果返回的主要步骤:
1. SQL语句提交
- 用户接口:用户通过SQL*Plus、SQL Developer、PL/SQL Developer或其他数据库工具提交SQL语句。
- 网络传输(如果适用):对于远程数据库,SQL语句通过网络协议(如TCP/IP)发送到数据库服务器。
2. 解析
- 语法检查:Oracle首先检查SQL语句的语法是否正确。
- 语义检查:然后,它检查SQL语句中引用的表、列、数据类型等是否存在于数据库中,以及用户是否有足够的权限访问它们。
- 共享池查询:Oracle会检查共享池(Shared Pool)中的库缓存(Library Cache),看是否已经存在相同或相似的SQL语句的执行计划。如果存在,它可能会重用已有的执行计划,这个过程称为SQL语句的软解析。如果不存在,则需要进行硬解析。
官方的Oracle体系结构图,可见实例是系统分配给Oracle的内存和一堆进程的结合体,这里主要回顾执行sql语句会涉及到的几个部分: - SGA中的shared pool、database buffer cache、redo log buffer,
- PGA中的Hash Area、Private SQL Area
- 进程中的DBWn、LGWR、CKPT
shared pool区域如上图,包括 Library Cache、Data Dictionary Cache 和 Server Result Cache
- Library Cache 主要用于储存可执行的SQL和PL/SQL代码
- Data Dictionary Cache 主要用于缓存数据字典的相关数据,该缓存区域对所有服务进程共享
- Server Result Cache 主要用于保存SQL和PL/SQL执行产生的结果集
3. 硬解析
如果SQL语句需要硬解析,Oracle会执行以下步骤:
- 生成执行计划:Oracle优化器根据统计信息、索引、表的物理结构等因素,生成SQL语句的一个或多个可能的执行计划。
- 选择最佳执行计划:优化器会评估每个执行计划的成本,并选择成本最低的执行计划。
- 将执行计划存储在共享池中:选择的执行计划会被存储在共享池中的库缓存中,以便将来可以重用。
4. 执行
- 数据访问:根据执行计划,Oracle会访问数据库中的表、索引等对象,获取需要的数据。
- 排序和聚合:如果SQL语句中包含ORDER BY、GROUP BY等子句,Oracle会对数据进行排序和聚合操作。
- 连接:如果SQL语句涉及多个表的连接操作,Oracle会按照执行计划中的指示执行连接操作。
5. 返回结果
- 结果集构建:将查询结果构建成一个结果集。
- 返回给客户端:将结果集通过网络(如果适用)返回给发起查询的客户端。
6. 后处理
- 日志记录:Oracle会记录与查询相关的日志信息,如Redo日志、Undo日志等。
- 资源清理:释放查询执行过程中使用的资源,如内存和临时空间。
需要注意的是,这个过程是高度优化的,Oracle数据库在设计和实现时考虑到了各种优化技术,以最小化查询时间、最大化系统吞吐量并优化资源使用。此外,随着Oracle数据库版本的更新,内部实现和性能优化可能会有所不同。