首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Oracle:我可以在共享池中找到查询,但在源代码中找不到查询。它是从哪里来的?

在Oracle数据库中,共享池是一个重要的内存区域,用于存储共享的SQL和PL/SQL代码以及相关的执行计划。当一个查询被执行时,Oracle会首先检查共享池中是否已经存在该查询的执行计划,如果存在则直接使用,避免了重复解析和优化查询的过程,提高了查询的性能。

根据提供的信息,如果在共享池中找到了查询,但在源代码中找不到查询,那么有可能是因为该查询是通过动态SQL语句生成的。动态SQL是指在程序运行时根据不同的条件拼接SQL语句,然后执行的方式。这种方式在一些场景下非常灵活,但也增加了代码的复杂性。

在动态SQL的情况下,查询的具体语句可能无法在源代码中直接找到,因为它是在运行时根据条件生成的。这样的查询通常会被解析和优化后存储在共享池中,以便下次执行时直接使用。

总结起来,如果在共享池中找到了查询,但在源代码中找不到查询,那么很可能是因为该查询是通过动态SQL生成的。这种方式可以提高程序的灵活性,但也增加了代码的复杂性。

腾讯云相关产品推荐:

  • 云数据库 TencentDB:提供高性能、高可用的数据库服务,支持主流数据库引擎,满足不同业务场景的需求。产品介绍链接:https://cloud.tencent.com/product/cdb
  • 云服务器 CVM:提供弹性、安全、稳定的云服务器实例,可根据业务需求灵活调整配置。产品介绍链接:https://cloud.tencent.com/product/cvm
  • 云函数 SCF:无服务器计算服务,支持按需运行代码,无需关心服务器管理,实现快速部署和弹性扩缩容。产品介绍链接:https://cloud.tencent.com/product/scf
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【DB笔试面试575】在Oracle中,SQL语句的执行过程有哪些?

♣ 题目部分 在Oracle中,SQL语句的执行过程有哪些? ♣ 答案部分 Oracle数据库里SQL语句的执行过程可以如下图所示: ?...如果目标SQL能通过上述检查,那么接下来Oracle就会去SGA的共享池中的库缓存(Library Cache)中查找是否存在匹配的共享游标(Shared Cursor)。...如果找到了匹配的共享游标,那么Oracle就会把存储于该共享游标中的解析树和执行计划直接拿过来重用,这相当于跳过了后续的“查询转换”和“查询优化”这两个步骤,直接进入到“实际执行”阶段。...(3)如果找不到匹配的共享游标,就意味着此时没有可以被重用的解析树和执行计划,那么接下来整个执行过程就进入到查询转换这一步。...在Oracle 9i中,查询转换是独立于优化器的,它与优化器的类型无关,但是从Oracle 10g开始,Oracle会对某些类型的查询转换(比如子查询展开、复杂视图合并等)分别计算经过查询转换后的等价改写

1.4K10

Oracle|SGA (System Global Area)详解

内存结构 1、Fixed SGA 固定SGA 可以把这个区想成是 SGA中的“自启”区,Oracle在内部要使用这个区来找到SGA的其他区。...在解析一个查询时,解析得到的表示(representation)就缓存在那里。在完成解析整个查 询的任务之前, Oracle会搜索共享池,看看这个工作是否已经完成。...PL/SQL运行的代码就在共享池中缓存,所以下一次运行时,Oracle不会再次从磁盘重新读 取。PL/SQL代码不仅在这里缓存,还会在这里共享。...简单地讲,就像是厨房的水池一样,什么东西都往共享池里放。 注: 这是个共用的东西,大家都可以用。比如一个用户进行一次查询,在解析之前,查看共享池,这个sql语句是否已经缓存在这里了。...我的理解是:其实是把原来属于共享池里面的一些特殊的内存拿出来进行不同的处理。因为这些内存用完之后就可以立即释放,而共享池的内存不存在释放问题,因为是大家共享的。

74020
  • 深入解析:由SQL解析失败看开发与DBA的性能之争

    oracle systemdump 也可以找到解析失败 SQL; 以下我们来看看这个精彩的案例分享。...select * from enmo where id=100; 硬解析比如一个新执行的 SQL 没有在共享池中,那么就要经历一个硬解析的过程,关于过程这里就不在多讲 SQL 不能共享,不能共享的原因有很多比如没有在同一个用户下面执行...解析失败的 SQL 是否会在共享池中存储?怎么查询到解析失败的 SQL? 很多时候我们会有这样一个误区,既然语法错误或者对象不存在应该在语法语义检查这个步骤就挂了怎么还好存在共享吃里面呢?...中遍历,如果找到了就直接用该 sql 缓存的执行计划等,如果找不到则从头解析,并把解析后执行计划等缓存在 hash bucket 中。...另外父游标的 heap 0 中存储着子游标的句柄地址。如果解析错误的 SQL 在共享池中存储的话那么必然要产生一个父游标然后父游标里面存储的有 SQL 文本之类的信息,但是子游标的?

    1.7K50

    【重磅推荐】从Library Cache等待事件深入剖析SQL解析

    select * from enmo where id=100; 硬解析比如一个新执行的 SQL 没有在共享池中,那么就要经历一个硬解析的过程,关于过程这里就不在多讲 SQL 不能共享,不能共享的原因有很多比如没有在同一个用户下面执行...解析失败的 SQL 是否会在共享池中存储?怎么查询到解析失败的 SQL? 很多时候我们会有这样一个误区,既然语法错误或者对象不存在应该在语法语义检查这个步骤就挂了怎么还好存在共享吃里面呢?...那么怎么证明就是解析失败的 SQL 存在共享池中并且在解析的时候持有 library cache latch 呢? 做下面测试之前我们先回顾一个 Oracle 一些基本概念。...当 sql 执行时候,首先会对 sql 文本进行 hash 运算然后根据 hash 值去相关 hash bucket 中遍历,如果找到了就直接用该 sql 缓存的执行计划等,如果找不到则从头解析,并把解析后执行计划等缓存在...另外父游标的 heap 0 中存储着子游标的句柄地址。如果解析错误的 SQL 在共享池中存储的话那么必然要产生一个父游标然后父游标里面存储的有 SQL 文本之类的信息,但是子游标的?

    1.1K40

    典型案例:深入剖析 ORA-04031 的前世今生

    在继续下面的内容之前我先介绍一下本次案例中这套数据库的情况。...,大家可以参考【细致入微:Oracle 中执行计划在 Shared Pool 中的存储位置探秘】 http://dwz.cn/3PinUl,我在这里就不再赘述了。...要理解它,我们需要先看看共享池中 subpool 的演变过程: Oracle 从9i开始为了提高 Oracle 的并发性,减少竞争,Oracle 将 shared pool 划分为多个 subpool,...再来查询一下本案例中每个 sub pool 的空闲内存的情况(截取了部分结果): 从结果可以看出,2号 subpool 的1号 subsubpool 中( 即 heap(2,0))最大的空闲可用的内存为...从 10g 开始,我们确实有这样的功能,允许当内存请求在选定的子池中无法满足时,“交换”到其他子池进行搜索,但这功能不可能对所有的内存结构和元素都起作用。注意:有一小部分功能会跨子池的利用内存块。

    1.5K90

    深入剖析 ORA-04031 的前世今生

    在继续下面的内容之前我先介绍一下本次案例中这套数据库的情况。...本次对4031错误的分析也是一样。哪么我首先来查看了数据库的 alert 日志,果不其然,日志里面有大量的4031错误,记录如下所示: ?...要理解它,我们需要先看看共享池中 subpool 的演变过程: Oracle 从9i开始为了提高 Oracle 的并发性,减少竞争,Oracle 将 shared pool 划分为多个 subpool,...而 Oracle 从10g开始将每一个 subpool 又划分成4个更小的 pool,姑且记为 sub subpool 吧(这个叫法只是我这样叫,官方的叫法我没有查到,知道这个意思就行了) ?...从 10g 开始,我们确实有这样的功能,允许当内存请求在选定的子池中无法满足时,“交换”到其他子池进行搜索,但这功能不可能对所有的内存结构和元素都起作用。注意:有一小部分功能会跨子池的利用内存块。

    1.2K51

    查询优化器基础知识—SQL语句处理过程

    游标和私有SQL区域位于程序全局区域(PGA)中。 在解析调用期间,数据库执行检查以便识别在语句执行之前可以找到的错误。有些错误解析时无法捕获。...语法正确的语句可能无法进行语义检查,如以下不存在的表的查询示例所示: 3.1.1.3 共享池检查 在解析期间,数据库执行共享池检查以确定它是否可以跳过资源密集的语句处理步骤。...该语句的执行计划的哈希值 SQL 语句可以在共享池中具有多个计划。通常,每个计划都有不同的哈希值。如果相同的 SQL ID 具有多个计划哈希值,则数据库就会知道此 SQL ID 存在多个计划。...下图是专用服务器体系结构中 UPDATE 语句的共享池检查的简化表示。 图3-2共享池检查 如果检查确定共享池中的语句具有相同的哈希值,则数据库将执行语义和环境检查以确定语句是否具有相同的含义。...3.2 Oracle 数据库如何处理 DML 大多数 DML 语句都有一个查询组件。在查询中,执行游标会将查询结果放入一组称为结果集的行中。

    4K30

    读书笔记系列01-《收获、不止Oracle》

    这本书是我个人觉得写的最有趣的Oracle书籍,也是我接触Oracle后第一本完全精读的Oracle中文书籍。...今后学习一门技术,甚至是一个知识点,都要思考为什么要学它,它是解决什么问题的。这些道理应用广泛,不止局限于学习Oracle技术。...通过语句执行过程体会Oracle体系结构: 查询语句(select)执行过程:在1区准备,完成用户连接信息的保存和权限保存,生成一个唯一的hash值,进入2区,首先是到共享池处理,此hash值没有,则需要检查语法语义权限解析生成执行计划...,然后进入数据缓冲区查询,如果没有,则数据缓冲区从数据文件中查到并带回数据缓冲区,最终呈现给用户。...修改语句(update, insert, delete)执行过程:查询语句有的过程都有,在数据缓冲区找到要修改的块,修改之前生成前镜像(CR块),修改后提交,LGWR进程将log buffer条目写入redo

    74810

    【DB笔试面试528】在Oracle中,如何解决ORA-04030和ORA-04031错误?

    当Oracle不能找到一个足够大的内存块来满足用户操作所带来的内部分配请求的时候,ORA-04031错误就可能在SGA的任何一个池中(Large Pool、Java Pool、Streams Pool(...MOS文档(ID 2016002.1和146599.1)对ORA-04031有非常详细的说明。 在Oracle 9i和之后的版本,共享池可以被划分为子池。...,在ASM环境中也用到了共享池。...当试图在共享池中分配大块连续内存而失败时,Oracle会首先从池中清理当前不用的对象从而使得空闲内存碎片(chunk:内存块)得以合并。...(5)Oracle的BUG导致内存泄露。例如,在一些版本中查询V$SEGMENT_STATISTICS这样的视图导致内存泄露,使Shared Pool内存耗光。

    2K31

    【SQL必知必会】004-基础篇:学会用数据库的方式思考SQL是如何执行的

    【SQL必知必会】004-基础篇:学会用数据库的方式思考SQL是如何执行的 本文介绍了 sql 语句在 Oracle 和 MySQL 中的执行过程!...在共享池中,Oracle 首先对 SQL 语句进行 Hash 运算,然后根据 Hash 值在库缓存(Library Cache)中查找,如果存在 SQL 语句的执行计划,就直接拿来执行,直接进入“执行器...-- 而第二种方式使用了绑定变量,那么在第一次查询之后,在共享池中就会存在这类查询的执行计划,也就是软解析。 我们可以通过使用绑定变量来减少硬解析,减少 Oracle 的解析工作量。...但是这种方式也有缺点,使用动态SQL 的方式,因为参数不同,会导致 SQL 的执行效率不同,同时 SQL 优化也会比较困难。 共享池是 Oracle 中的术语,包括了库缓存,数据字典缓冲区等。...7、执行器 当有了解析树和执行计划之后,就知道了 SQL该怎么被执行,这样就可以在执行器中执行语句了。

    6710

    CMU 15-445 数据库课程第五课文字版 - 缓冲池

    页表在内存中,它是临时的。我们不需要持久化这个页表,页表可以在我们执行查询时逐步建立。 一个问题:在内存中设置了页表某一帧的 dirty 位后,如果掉电,我们会丢失对页面的更新吗?...)的概念开始:从逻辑上讲 DBMS 有一种缓冲池,你可以把页从磁盘加载到内存中,但在物理上,它可以被实现为具有不同策略的多个单独的缓冲池。...下一个是扫描共享(Scan Sharing) 其基本思想是查询可以重用从存储中检索的数据,这也被称为同步扫描(Synchronized scans),它不同于结果缓存。...在 Informix 这个系统中叫做轻量扫描(Light Scans)。并且 Oracle,SQLServer,PostgresSQL 中也有这种优化机制。...如果你的缓冲池中有一个不脏的页面,当它需要从缓冲池中剔除的时候,你可以直接删除它,覆盖它,我们不需要保留它。因为没有任何变化,它备份在磁盘上,如果我们需要我们总是可以从磁盘恢复它。

    47020

    Oracle-绑定变量binding variable解读

    当一个SQL语句提交后,Oracle 在接收到这些SQL后,会先对这个SQL做一个hash 函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash 值匹配的SQL存在。...如果在共享池中没有找到相同Hash 值的SQL,oracle 会认为这是一条新的SQL, 会进行硬解析。 而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。...从效率来看,由于oracle10G放弃了RBO,全面引入CBO,因此,在10G中使用绑定变量效率的提升比9i中更为明显。...area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享....使用这个特性,下面,我给出一条SQL,用来查询可以使用绑定变量进行获益的SQL语句 with match_info as ( select force_matching_signature

    2K10

    【史上最详解】Oracle数据库各种锁 - 看完这篇就够了!

    其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁,共享更新锁可以再施加,但不允许持有共享更新封锁的进程做更新。 共享该表的所有用户只能查询表中的数据,但不能更新。...---- 独占方式表级锁( Exclusive) 独占方式表级锁是用于加锁表中的所有数据,拥有该独占方式表封锁的用户,即可以查询该表,又可以更新该表,其它的用户不能再对该表施加任何加锁(包括共享、独占或共享更新封锁...---- 分析锁 ORACLE 使用共享池存储分析与优化过的 SQL 语句及 PL/SQL 程序,使运行相同语句的应用速度更快。 一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。...当一个事务修改或删除了共享池持有分析锁的数据库对象时, ORACLE 使共享池中的对象作废,下次在引用这条SQL/PLSQL 语 句时, ORACLE 重新分析编译此语句。...特别是在 OLAP 系统中,从表经常会是非常巨大的表,在这种情况下,如果从表没有索引,那么查询几乎是不可想象的。

    18.3K87

    【DB笔试面试579】在Oracle中,SQL的解析过程的硬解析、软解析和软软解析的区别有哪些?

    如果在库缓存中找不到匹配的父游标,那么Oracle就会新生成一个会话游标和一对共享游标(即父游标和子游标);如果找到了匹配的父游标,但找不到匹配的子游标,那么Oracle就会新生成一个会话游标和一个子游标...l 如果在当前会话的PGA中找不到匹配的缓存会话游标,但在库缓存中找到了匹配的父游标和子游标,那么Oracle会新生成一个会话游标并重用刚刚找到的匹配父游标和子游标,这个过程对应的就是软解析。...硬解析大致可以分为5个执行步骤: (1)语法分析。 (2)权限与对象检查。 (3)在共享池中检查是否有完全相同的之前完全解析好的。...这里需要注意的是,从11gR1开始,Oracle用Mutex替换了库缓存相关Latch,所以在Oracle 11gR1及其后续的版本中,将不再存在库缓存相关Latch的争用,取而代之的是Mutex的争用...在这种情况下,当同一条目标SQL再次重复执行时(显然是软解析),此时是可以找到匹配的共享游标的,但依然找不到匹配的会话游标(因为之前硬解析时对应的会话游标己经被Close掉了),这意味着Oracle还必须为该

    1.5K20

    Java基础系列2:深入理解String类

    intern方法是个Native方法,会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。 由于String字符串的不可变性,常量池中一定不存在两个相同的字符串。...内存区域 在HotSpot VM中字符串常量池是通过一个StringTable类实现的,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例中只有一份...intern 方法是一个native方法,intern方法会从字符串常量池中查询当前字符串是否存在,如果存在,就直接返回当前字符串;如果不存在就会将当前字符串放入常量池中,之后再返回。..."ABC"的字符串,找到了就不会创建新的"ABC"字符串,找不到才会去创建新的"ABC"字符串;如果不使用intern方法,则没有去常量池查找的过程,会直接创建新的"ABC"字符串。...可以看出二者的区别是: 使用intern(),实际创建的对象数目是少于需要创建的对象数目的,因为会有常量池的字符串共享;但相应的,所需要的常量池的查询消耗会增加时间损耗;这体现出的是一种空间友好,不需要太多

    65030

    Oracle 12.2新特性掌上手册 - 第三卷 Sharding 的增强

    它可以在不共享硬件或软件的Oracle数据库池中分发和复制数据。应用程序将数据库池视为单个逻辑数据库。应用程序可以通过向池中添加数据库(分片),在任何平台上将数据、事务和用户弹性扩展到任何级别。...分段数据库(SDB) - 单个逻辑Oracle数据库,横跨在没有共享硬件或软件的物理Oracle数据库(分片)池中进行水平分区 分片 - 承载分片数据库子集的独立物理Oracle数据库 全局服务 - 提供对...在分片之间不需要共享存储。分片数据库是分片的集合。 分片可以放置在一个区域或不同的区域中。 在Oracle Sharding的环境中,一个区域代表一个数据中心或处于紧密网络邻近的多个数据中心。...对于典型的SDB,每个区域的专用低端商用服务器上安装一组碎片导向,若要实现高可用性,可以部署多个分片导向。在Oracle 12.2中,可以在给定区域中部署最多5个分片导向....Oracle Sharded 数据库的完整平台包括: 1、水平分割10,100或1000个不共享硬件或sorware的离散Oracle数据库的数据和工作负载 2、自动端到端生命周期管理 对于单片查询和分片间查询

    98231

    JDBC【数据库连接池、DbUtils框架、分页】

    步骤: 导入开发包【c3p0-0.9.2-pre1.jar】和【mchange-commons-0.2.jar】 导入XML配置文件【可以在程序中自己一个一个配,C3P0的doc中的Configuration...目录下配置context.xml文件【文件内容可以在tomcat默认页面的 JNDI Resources下Configure Tomcat's Resource Factory找到】 导入Mysql或oracle...类 该类简化了SQL查询,配合ResultSetHandler使用,可以完成大部分的数据库操作,重载了许多的查询,更新,批处理方法。...5行数据,我要查询第2页的数据 分析: 1:第2页的数据其实就是从第6条数据开始,取5条 实现: 1:start为5【偏移量从...分析: 算出有多少页数据这是非常简单的【在数据库中查询有多少条记录,你每页显示多少条记录,就可以算出有多少页数据了】 使用Mysql或Oracle的分页语法即可 通过上面分析,我们会发现需要用到4个变量

    1.1K40

    【DB笔试面试527】在Oracle中,内存结构主要由什么组成?

    (1)数据缓冲区(Database Buffer Cache):也叫数据库缓冲区高速缓存,用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能,是数据库实例的重要组成部分。...参数DB_CACHE_SIZE可指定数据缓冲区的大小,需要在参数文件中静态修改。Oracle在处理某个查询时,服务器进程会在Buffer Cache中查找它所需的所有数据块。...如果未在Buffer Cache中找到所需要的数据块,那么服务器进程会从数据文件中读取所需的数据块,并在Buffer Cache中添加一个副本。...保留池中的数据不会被替换出去,可以将常用的小表放置在该区可以降低I/O操作。可以通过DB_KEEP_CACHE_SIZE参数指定保留池的大小。该区域的大小不会被ASMM自动调节。...Redo Entry是Oracle从用户会话占用的内存里将这些变更的记录复制到Redo日志缓冲区内,其在内存中是一段连续的内存块,Oracle利用后台进程LGWR在适当的时机将Redo日志缓冲区中的信息

    1K10

    在Oracle中,内存结构主要由什么组成?

    (1)数据缓冲区(Database Buffer Cache):也叫数据库缓冲区高速缓存,用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能,是数据库实例的重要组成部分。...参数DB_CACHE_SIZE可指定数据缓冲区的大小,需要在参数文件中静态修改。Oracle在处理某个查询时,服务器进程会在Buffer Cache中查找它所需的所有数据块。...如果未在Buffer Cache中找到所需要的数据块,那么服务器进程会从数据文件中读取所需的数据块,并在Buffer Cache中添加一个副本。...保留池中的数据不会被替换出去,可以将常用的小表放置在该区可以降低I/O操作。可以通过DB_KEEP_CACHE_SIZE参数指定保留池的大小。该区域的大小不会被ASMM自动调节。...Redo Entry是Oracle从用户会话占用的内存里将这些变更的记录复制到Redo日志缓冲区内,其在内存中是一段连续的内存块,Oracle利用后台进程LGWR在适当的时机将Redo日志缓冲区中的信息

    58110
    领券