在Oracle数据库中,一条SQL查询请求的执行过程是一个复杂且精细的流水线
1.解析阶段(Parse)
1.1语法检查
词法分析:将SQL语句拆分为关键字(如SELECT)、标识符(如表名、列名)、运算符和常量。 |
语法树生成:验证语法是否符合规范,例如确保WHERE子句后紧跟条件表达式。 |
1.2语义检查
对象验证:确认表、列、视图是否存在,且用户有访问权限。 |
数据类型匹配:检查表达式和操作数是否兼容(如字符串与数字比较)。 |
1.3共享池查找
存储SQL解析树、执行计划、数据字典缓存等。
软解析:若SQL语句的哈希值存在于共享池(Library Cache),则直接复用已缓存的执行计划,跳过优化阶段。 |
硬解析:若未命中缓存,则生成新的执行计划并缓存。 |
2.优化阶段(Optimize)
2.1生成候选执行计划
基于成本的优化(CBO):根据统计信息(如表的行数,索引选择性)、系统参数(如db_block_size)生成多个执行计划。 |
考虑因素:全表扫描 vs 索引扫描的成本、表连接顺序(嵌套循环、哈希连接、排序合并)。 |
2.2选择最优执行计划
成本计算:评估每个计划的I/O,CPU,内存成本,选择总成本最低的计划。 |
执行计划缓存:将最终计划存入共享池,供后续相同SQL复用。 |
3.执行阶段(Execute)
3.1数据访问
缓冲区缓存(Buffer Cache):
逻辑读:若数据块已在缓存中,直接读取。 |
物理读:若数据块未缓存,触发db_file_multiblock_read_count定义的多块读操作,将数据从磁盘加载到缓存。 |
访问方式:
全表扫描:顺序读取所有块(适合小表或低选择性查询)。 |
索引扫描:通过B树索引定位数据(适合高选择性查询)。 |
3.2排序与聚合
内存排序:若排序数据量小于SORT_AREA_SIZE,在内存完成。
磁盘临时表:大数据量排序使用临时表空间。
聚合计算:如SUM/AVG,在排序后或哈希分组后执行。
4.结果返回阶段(Fetch)
4.1结果集处理
过滤与分组:应用HAVING子句、DISTINCT去重。
分页处理:通过ROWNUM或FETCH FIRST实现分页(如WHERE ROWNUM<=10)。
4.2客户端交互
网络传输:结果集通过SQL*Net协议传输到客户端。
结果渲染:客户端工具(如SQL*Plus、PL/SQL Developer)解析结果并展示。
5.性能优化关键点
(1)减少硬解析:使用绑定变量(Bind Variables)避免SQL语句字面量变化。
(2)统计信息更新:定期运行DBMS_STATS收集统计信息,确保CBO决策准确。
(3)执行计划监控:通过EXPLAIN PLAN查出预估计划,用AUTOTRACE分析实际执行计划统计信息(如逻辑读,物理读)。
(4)参数调优:调整db_block_size(单次I/O数据量)、optimizer_mode(ALL_ROWS或FIRST_ROWS)等参数。
综上所述一条SQL语句的整个执行过程如下:
用户进程提交SQL —> 语法/语义检查 —> 共享池检查(软解析/硬解析) —> 优化器生成执行计划 —> 选择最优计划 —> 执行计划缓存 —> (执行阶段)数据访问(逻辑读/物理读) —> 排序/聚合 —> 结果返回 —> 客户端接收结果 —> 渲染结果。 |
SGA/PGA
SGA(共享内存区域):存储数据库的全局数据和控制信息,所有用户进程和后台进程均可访问。
PGA:是每个进程服务器的是有内存区域,用于存储会话级数据和操作上下文,进程终止时释放。
核心组件:
私有SQL区:存储SQL解析树、执行计划及运行时数据(如绑定变量)。 |
会话内存:保存会话变量,事务状态,游标信息等。 |
排序区:为排序,哈希连接等操作提供临时内存。 |
哈希区:支持哈希连接和聚合操作。 |
SGA和PGA的核心区别:
SGA | PGA | |
共享性 | 全局共享,所有进程访问 | 进程私有,独立分配 |
生命周期 | 随实例启动分配,实例关闭释放 | 随进程创建分配,进程终止释放 |
用途 | 存储全局数据(缓存、日志、公共享资源) | 存储会话级数据(SQL执行,排序,变量) |
配置模式 | 支持手动调整组件大小(如SGA_TARGET自动管理) | 支持手动或自动管理(PGA_AGGREGATE_TARGET) |
配置优化:
(1)SGA优化:自动管理SGA_TARGET自动调整组件大小,需设置STATISTICS_LEVEL=TYPICAL;手动调优,根据负载调整db_buffer_cache_size(OLTP场景优先)和shared_pool_size(复杂场景优先);
(2)PGA优化:自动管理设置PGA_AGGREGATE_TARGET,Oracle动态内存分配,平衡性能与占用资源。手动调优,针对排序密集型操作,增大SORT_AREA_SIZE;对哈希连接调整HASH_AREA_SIZE;
监控工具:
SGA监控:查询V$SGASTAT视图,观察内存分配命中率; |
PGA监控:查询V$PGASTAT视图,分析会话级内存使用情况; |