当前位置: 首页 > news >正文

在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的核心区别:

SGAPGA
共享性全局共享,所有进程访问进程私有,独立分配
生命周期随实例启动分配,实例关闭释放随进程创建分配,进程终止释放
用途存储全局数据(缓存、日志、公共享资源)存储会话级数据(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视图,分析会话级内存使用情况;

相关文章:

  • CSS学习02 动态列数表格开发,解决多组数据布局与边框重合问题
  • WEB前端开发中常用的算法
  • 布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维
  • 从Function Calling到Tool Calling:Spring AI架构升级背后的技术考量
  • Git 高级操作
  • VMWare Workstation 17 安装 Ubuntu24.02
  • pycharm如何通过跳板机连接服务器在本地debug
  • Pytorch torch.utils.data.dataloader.default_collate 介绍
  • CTF web入门之命令执行 完整版
  • Git代码管理
  • 代码随想录-06-二叉树-05.01 二叉树的层序遍历
  • 【股票数据API接口19】如何获取股票主力资金走势数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 【力扣hot100题】(088)分割等和子集
  • MySQL-多表查询-自连接联合查询子查询
  • Leetcode131:分割回文串——回溯算法
  • 【Linux】线程池与封装线程
  • apijson 快速上手
  • 5.DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互:
  • Spring Boot 常用依赖介绍
  • 什么是自动化测试?
  • 购物网站产品做促销能赚钱吗/我想接app注册推广单
  • 张家港营销型网站建设/百度快速收录权限域名
  • 宝安区做网站/baud百度一下
  • 我要网站建设/seo整站优化吧
  • 体育用品电子商务网站建设方案/西安seo优化工作室
  • 许昌注册公司代办/重庆seo网站收录优化