网站首页 > 技术文章 正文
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 报表
你 发表评论:
欢迎- 09-0613.通过Excel导出数据库中的维值_数据库exp导入导出数据
- 09-06做数据分析时,SQL需要达到以下水平
- 09-06Java开发指南:JDK21下载、安装及目录解析,轻松开启编程之旅
- 09-06hive存储过程_hive存储过程环境变量
- 09-06Maven常用命令_maven常用命令有哪些
- 09-06JDK从8升级到21的问题集_jdk更新到几了
- 09-06Oracle狂刷存在感 NRF展会惊艳四座
- 09-06哪些软件支持UDI标签的生成与验证
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)