网站首页 > 技术文章 正文
SQL解析与游标
SQL解析是数据库执行一条SQL语句的必要步骤。它主要完成对SQL语句的各种分析、检查,并制定执行计划。最后将执行计划交由执行器去执行即可。而游标是作为SQL解析的结果缓存在共享池中,可作为后续执行同一SQL时直接调用使用。这里所说的游标,不要和PL/SQL开发中的游标混淆。这里的游标是指在Oracle中解析SQL语句生成执行计划的一个载体,保存在共享池中的一种数据结构。
数据库首先将SQL文本转化为ASCII字符,然后根据哈希算法计算其对应的值(就是对应于V$SQL.SQL_ID)。根据计算出的这个值到共享池中的一个区域(就是library cache)中找到对应的一块结构(又称bucket),然后比较bucket里是否存在该SQL语句。
如果找到该语句,则返回对应的执行计划(可能有多个,需要选择一个)。如果没有找到,则进入硬解析的过程。
硬解析。如果数据库无法在内存中找到这条语句,则需要经历一个硬解析的过程。在这个过程中需要申请一块内存空间(并通过名叫latch的结构保证不被别人访问)。同时还需要访问数据字典获得对象必要的信息。
数据库硬解析的过程就是生成游标的过程;
软解析的过程就是找到以前生成的游标的过程;
软解析就是直接在客户端就找到了缓存在本地的游标过程。
从性能的角度而言,需要尽可能地避免发生硬解析。
这也是为什么数据库要将共享游标保存在库缓存中的原因。
因为这样,属于这个实例的每一个进程都可以重用它们。
有两个原因可以解释为什么硬解析的开销较高。
第一个原因是硬解析过程很长,涉及大量复杂操作,这些都非常依赖CPU的操作。
第二个原因是要分配内存来将父游标与子游标保存在库缓存中。
由于库缓存是在所有的会话之间共享的,库缓存中的内存分配必须串行执行。
在实际操作中,在分配父游标和子游标所需的内存之前,必须取得一个保护共享池的闩锁。
虽然软解析的影响已经远比硬解析要小,但还是需要尽量避免软解析,因为它也会导致某种串行处理。
事实上,为了所有共享的父游标,也必须取得一个保护库缓存的闩锁。
总的来讲,需要尽可能避免硬解析和软解析,因为它们都会抑制应用程序的可扩展性。
猜你喜欢
- 2024-11-12 深入剖析Oracle SCN机制 oracle ssc
- 2024-11-12 分析oracle日志挖掘实操&定期清理归档日志脚本(二)
- 2024-11-12 Oracle两张表数据比较的几种方式 oracle对比两个表中字段不一致
- 2024-11-12 Oracle SQL解析全过程 oracle sql%
- 2024-11-12 Oracle项目管理系统之报表分析 oracle 报表
你 发表评论:
欢迎- 615℃几个Oracle空值处理函数 oracle处理null值的函数
- 607℃Oracle分析函数之Lag和Lead()使用
- 595℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 592℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 586℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 580℃【数据统计分析】详解Oracle分组函数之CUBE
- 569℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 560℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)