【SQL】Oracle SQL共享池检查

来源:这里教程网 时间:2026-03-03 17:00:33 作者:

在解析过程中,数据库执行共享池检查以确定它是否可以跳过语句处理的资源密集型步骤。

为此,数据库使用哈希算法为每个 SQL 语句生成一个哈希值。 声明哈希值是 所示 V$SQL.SQL_ID 该哈希值在 Oracle 数据库版本中是确定性的,因此单个实例或不同实例中的相同语句具有相同的 SQL ID。

当用户提交一条 SQL 语句时,数据库会在 查找 现有的已解析语句是否具有相同的哈希值。 SQL 语句的哈希值不同于以下值:

  • 语句的内存地址

    Oracle 数据库使用 SQL ID 在查找表中执行键控读取。 这样,数据库就获得了该语句可能的内存地址。

  • 语句  哈希值

    一个 SQL 语句在共享池中可以有多个计划。 通常,每个计划都有不同的哈希值。 如果同一个 SQL ID 有多个计划哈希值,则数据库知道此 SQL ID 存在多个计划。

    根据提交的语句类型和哈希检查的结果,解析操作分为以下几类:

  • 硬解析

    如果Oracle数据库无法重用现有代码,则必须构建应用程序代码的新可执行版本。此操作称为硬解析或库缓存未命中。

    注:

    数据库始终执行 DDL 的硬解析。

    在硬解析过程中,数据库会多次访问库缓存和数据字典缓存来检查数据字典。 当数据库访问这些区域时,它 在所需对象上 使用称为 的序列化设备, 以便它们的定义不会改变。 闩锁争用会增加语句执行时间并降低并发性。

  • 软解析

    软解析是任何不是硬解析的解析。如果提交的语句与共享池中的可重用SQL语句相同,则Oracle数据库将重用现有代码。这种代码重用也称为库缓存命中。

    软解析在执行多少工作方面可能会有所不同。 例如,配置会话共享 SQL 区域有时可以减少软解析中的闩锁数量,使它们“更软”。

    一般来说,软解析比硬解析更可取,因为数据库会跳过优化和行源生成步骤,直接执行。

    下图是 UPDATE 专用服务器架构中语句 的共享池检查的简化表示

    图 3-2 共享池检查

    图 3-2 说明如下

    如果检查确定共享池中的语句具有相同的哈希值,则数据库执行语义和环境检查以确定语句是否具有相同的含义。 相同的语法是不够的。 例如,假设两个不同的用户登录到数据库并发出以下 SQL 语句:

    CREATE TABLE my_table ( some_col INTEGER );
    SELECT * FROM my_table;

    SELECT 两个用户 语句在语法上是相同的,但两个独立的模式对象被命名为 my_table 这种语义差异意味着第二个语句不能重用第一个语句的代码(它会有两个子游标)。

    即使两个语句在语义上相同,环境差异也会强制进行硬解析。 在这种情况下, 是可以影响执行计划生成的会话设置的总和,例如工作区大小或优化器设置(例如,优化器模式)。 考虑以下由单个用户执行的一系列 SQL 语句:

    ALTER SESSION SET OPTIMIZER_MODE=ALL_ROWS;
    ALTER SYSTEM FLUSH SHARED_POOL;               # optimizer environment 1SELECT * FROM sh.sales;ALTER SESSION SET OPTIMIZER_MODE=FIRST_ROWS;  # optimizer environment 2SELECT * FROM sh.sales;ALTER SESSION SET SQL_TRACE=true;             # optimizer environment 3SELECT * FROM sh.sales;

    在前面的示例中,相同的 SELECT 语句在三个不同的优化器环境中执行。 因此,数据库为这些语句创建了三个单独的共享 SQL 区域,并强制对每个语句进行硬解析。

    也可以看看:

  • 了解私有 SQL 区域和共享 SQL 区域的 

  • 了解如何配置共享池

  • 了解闩锁的 

    机翻,可查看原文,官方文档 sql-tuning-guide 第三章  ,也可参考本博其他文章:

    http://blog.itpub.net/29487349/viewspace-2785648/

  • 相关推荐