Oracle固定执行计划之SQL PROFILE概要文件详解

下面我就为您详细讲解一下“Oracle固定执行计划之SQL PROFILE概要文件详解”的完整攻略。

什么是SQL PROFILE?

SQL PROFILE 是一种将 SQL 语句的执行计划持久存储在数据库中的机制。它可以被看作是 Oracle 中固定查询计划的一种技术解决方案,它会将最佳的执行计划与 SQL 语句绑定在一起,从而确保每次执行 SQL 语句时都使用相同的执行计划。

创建 SQL PROFILE

使用 SQL PROFILE 的第一步是创建它,可以采用以下方式:

DECLARE
  my_plan  SYS.SQLPROF_ATTR;
  my_hint  VARCHAR2(100);
BEGIN
  my_hint := 'GATHER_PLAN_STATISTICS';
  my_plan := SYS.SQLPROF_ATTR(
    --
    -- Specify the hints to be used.
    -- These may be any valid hints; this example gathers plan
    -- statistics.
    --
    hint_text => my_hint,
    level     => 'DEFAULT',
    --
    -- Set the value of statistics_level as it should be when this
    -- profile is in use. This supports Oracle Database feature usage
    -- tracking and SQL plan directives. Tuning Oracle Database
    -- recommends AUTOTASK for managing SQL directives and SQL patches.
    --
    attr1     => 'STATISTICS_LEVEL=TYPICAL',
    --
    -- Set parameterized SQL text and bind type to NONE. The following
    -- SQL text matches a simple SQL query with no bind variables.
    --
    attr2     => 'SELECT ENAME, EMPNO FROM EMP WHERE EMPNO = 7788',
    bind_data => NULL,
    --
    -- Set the format of the SQL text.
    -- In this example, the format is lowercase and no formatting.
    --
    attr3     => 'NATIVE:o=LOWER',
    --
    -- This example assumes that my_prof is the name of a user-defined
    -- SQL profile. This step saves the profile to the database.
    --
    attr4     => 'NAME:my_prof',
    --
    -- Specify "DEFAULT" to indicate that this profile should be used
    -- when no user-defined profile or other hints are in use.
    -- Set the force_match parameter to TRUE to ensure that this profile
    -- will be used whenever possible.
    --
    attr5     => 'DEFAULT',
    force_match => TRUE
  );
  DBMS_SQLTUNE.CREATE_SQL_PROFILE(sql_text       => my_plan.attr2,
                                   profile        => my_plan,
                                   name           => my_plan.attr4,
                                   description    => 'My SQL Profile',
                                   category       => 'DEFAULT',
                                   validate       => TRUE,
                                   replace        => TRUE);
END;

上述示例代码中展示了如何创建一个名为“my_prof”的 SQL PROFILE,它包含了一个最合适的执行计划。

应用 SQL PROFILE

创建 SQL PROFILE 后,可以通过以下方式将其应用到 SQL 语句上:

DECLARE
  my_sql_id     VARCHAR2(13) := '5ftrg9fvdgf8d';
  my_plan_name  VARCHAR2(128) := 'my_prof';
BEGIN
  DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => my_sql_id);
  DBMS_SPM.ALTER_SQL_PROFILE(plan_name      => my_plan_name,
                             attribute_name => 'CATEGORY',
                             attribute_value => 'CUSTOM',
                             force_match     => TRUE);
END;

上述示例代码中展示了如何将 SQL PROFILE 应用到名为“5ftrg9fvdgf8d”的 SQL 语句上。

示例说明:

下面提供两条示例说明,以帮助更好地理解 SQL PROFILE 的使用方法。

示例一

假设我们有以下 SQL 语句:

select /*+ index(emp emp_email) */ * from emp where email = :email

这个 SQL 语句包含了一个子查询,但是 Oracle 会在执行时先查询主表,然后再执行子查询。

如果我们想要让 Oracle 直接执行子查询,可以使用以下方式创建一个 SQL PROFILE:

DECLARE
  my_plan  SYS.SQLPROF_ATTR;
  my_hint  VARCHAR2(100);
BEGIN
  my_hint := 'LEADING(emp_email emp)';
  my_plan := SYS.SQLPROF_ATTR(
    hint_text => my_hint,
    level     => 'DEFAULT',
    attr1     => 'STATISTICS_LEVEL=TYPICAL',
    attr2     => 'SELECT * FROM (SELECT /*+ no_unnest */ * FROM emp_email) WHERE email = :email',
    bind_data => NULL,
    attr3     => 'NATIVE:o=LOWER',
    attr4     => 'NAME:my_prof',
    attr5     => 'DEFAULT',
    force_match => TRUE
  );
  DBMS_SQLTUNE.CREATE_SQL_PROFILE(sql_text       => my_plan.attr2,
                                   profile        => my_plan,
                                   name           => my_plan.attr4,
                                   description    => 'My SQL Profile',
                                   category       => 'DEFAULT',
                                   validate       => TRUE,
                                   replace        => TRUE);
END;

上述示例代码中的 SQL PROFILE 将运行计划更改为在子查询上执行主表,在大多数情况下会比默认的显式连接更优。

示例二

假设我们有以下 SQL 语句:

SELECT /*+ ORDERED USE_HASH(a b) */ *
FROM a, b
WHERE a.id=b.id and a.id in (1,2,3);

这个 SQL 语句需要联结两个表,Oracle 默认的执行计划(使用嵌套循环连接)的性能并不理想。

如果我们希望Oracle使用HASH连接,可以使用以下方式创建一个SQL PROFILE:

DECLARE
  my_plan  SYS.SQLPROF_ATTR;
  my_hint  VARCHAR2(100);
BEGIN
  my_hint := 'USE_HASH(a b)';
  my_plan := SYS.SQLPROF_ATTR(
    hint_text => my_hint,
    level     => 'DEFAULT',
    attr1     => 'STATISTICS_LEVEL=TYPICAL',
    attr2     => 'SELECT /*+ USE_HASH(a b) */ *
              FROM a, b
             WHERE a.id=b.id and a.id in (1,2,3)',
    bind_data => NULL,
    attr3     => 'NATIVE:o=LOWER',
    attr4     => 'NAME:my_prof',
    attr5     => 'DEFAULT',
    force_match => TRUE
  );
  DBMS_SQLTUNE.CREATE_SQL_PROFILE(sql_text       => my_plan.attr2,
                                   profile        => my_plan,
                                   name           => my_plan.attr4,
                                   description    => 'My SQL Profile',
                                   category       => 'DEFAULT',
                                   validate       => TRUE,
                                   replace        => TRUE);
END;

上述示例代码中的 SQL PROFILE 将运行计划更改为使用 HASH 连接,可以获得更好的性能。

希望这两个示例可以帮助您更好地理解如何使用 SQL PROFILE。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle固定执行计划之SQL PROFILE概要文件详解 - Python技术站

(1)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • redis3.2报CONFIG SET protected-mode no异常

    CONFIG SET protected-mode no redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was spe…

    Redis 2023年4月13日
    00
  • php更新mysql后获取影响的行数发生异常解决方法

    下面我将详细讲解“PHP更新MySQL后获取影响的行数发生异常解决方法”的完整攻略。 问题描述 在 PHP 中使用 MySQL 的 UPDATE 或 INSERT 操作后获取影响的行数时,有时会发生异常,无法正确获取到影响的行数,这是一个很常见的问题。 原因分析 MySQL 更新或插入数据时,如果当前操作不影响任何数据,将返回一个值为0的结果。但如果此时调用…

    database 2023年5月21日
    00
  • Redis分布式锁详解

    Redis分布式锁是一种基于Redis实现的分布式锁,用于解决多个进程(或多个实例)访问共享资源时可能引发的并发问题。下面,本文将为读者详细讲解Redis分布式锁的完整攻略,包括Redis分布式锁的设计思路、代码实现以及使用注意事项。 Redis分布式锁的设计思路 Redis分布式锁的设计思路主要包括以下几个方面: 锁的存储结构 Redis分布式锁的存储结构…

    Redis 2023年3月21日
    00
  • 优化Apache服务器性能的方法小结

    以下是详细的“优化Apache服务器性能的方法小结”的攻略及示例说明: 攻略 1. 使用最新版本的Apache 使用最新版本的Apache能够提供更好的性能表现,并且通常都有更好的安全性和更少的Bug。因此,需要定期检查并更新服务器上的Apache版本。 2. 配置Apache的缓存选项来加速页面加载速度 使用适当的缓存方法可以极大地提高Web应用程序的性能…

    database 2023年5月22日
    00
  • Flutter上的数据监控深入理解

    Flutter上的数据监控深入理解 在Flutter开发过程中,我们需要对应用程序中的数据进行监控,以便及时发现和解决潜在的问题,提高应用程序的质量和性能。本文将详细探讨在Flutter上的数据监控深入理解,包括监控方式、监控工具和示例说明。 监控方式 在Flutter中,我们可以使用一些常用的方式来进行数据监控: 手动打印Log:通过Log来输出相关变量和…

    database 2023年5月19日
    00
  • MySQL如何恢复单库或单表,以及可能遇到的坑

    MySQL数据库恢复是数据库管理员非常常见的操作,常见的情况包括误删除、服务器故障等。在这种情况下,我们需要恢复数据库中的数据。本篇攻略将详细讲解MySQL如何恢复单库或单表,以及可能遇到的一些坑。 1. 恢复单库 在恢复单库之前,我们需要先停止MySQL服务,以确保数据不会被覆盖或丢失。以下是恢复单库的步骤: 备份当前的数据库文件 在进行数据恢复前,我们需…

    database 2023年5月22日
    00
  • rman备份脚本和rman增量备份脚本分享

    RMAN是Oracle官方提供的备份和恢复工具,在数据库备份和恢复方面有着很好的性能和稳定性。因此,Oracle管理员必须掌握RMAN备份和恢复技术。下面是分享两个常用的RMAN备份脚本。 1. RMAN全备份脚本 RMAN全备份脚本是备份整个数据库,包括数据文件、控制文件、归档日志。这个脚本要求在每次备份之前手动修改备份目录、备份标签和备份后是否自动清除过…

    database 2023年5月22日
    00
  • DBMS 中的事务管理

    事务管理是DBMS(数据库管理系统)中非常重要的一部分。它主要是用来保证数据库的一致性和可靠性的。下面将详细讲解DBMS中的事务管理的完整攻略,并给出实例说明。 1. 事务概念 事务是指在DBMS中,一组对数据进行访问和更新的操作。将这些操作作为一个不可分割的单元进行处理,要么全部执行,要么全部回滚(撤销)。事务是数据库恢复和并发控制的基础。 2. 事务的特…

    database 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部