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日

相关文章

  • 在Linux操作系统上安装和更新JAVA8的教程

    下面是在Linux操作系统上安装和更新JAVA8的教程: 确认是否已经安装了Java 在开始之前,首先需要确认本机是否已经安装了Java。可以在终端中输入如下命令: java -version 如果已经安装了Java,命令会输出Java的版本信息。如果没有安装则会提示命令未找到或者类似的错误。 安装Java 从Oracle官网下载安装包 可以从Oracle官…

    database 2023年5月22日
    00
  • MySQL 权限控制细节分析

    MySQL 权限控制细节分析 MySQL 是一种广泛应用于 web 开发、数据存储、数据分析等领域的关系型数据库。MySQL 的权限控制是确保数据安全的重要手段之一。本文将详细讲解 MySQL 权限控制的细节。 MySQL 用户 MySQL 有一个专门的用户系统,用于管理访问 MySQL 数据库服务器的用户。用户可以是本地用户或者远程用户。 创建用户 可以使…

    database 2023年5月22日
    00
  • 为什么在MySQL中不建议使用UTF-8

    为什么在MySQL中不建议使用UTF-8? 在MySQL的过去版本中,UTF-8被实现为最多需要3个字节来存储一个字符。然而,UTF-8的标准规范允许每个字符最多使用4个字节的存储空间。由于MySQL的实现方式是固定为最多使用3个字节存储一个字符,这意味着当存储需要4字节的字符时,MySQL会强制使用2个UTF-8字符来存储该字符,这被称为“UTF-8代理对…

    database 2023年5月22日
    00
  • mysql的sql语句特殊处理语句总结(必看)

    mysql的sql语句特殊处理语句总结(必看) 在mysql中,我们常常需要对查询结果进行特殊处理,比如去重、排序、分组、计数等等,这时候就需要用到一些特殊处理语句。本文总结了mysql的常见特殊处理语句及其用法,希望能够帮助大家更好地处理数据。 去重 去重是经常需要用到的操作,mysql中可以通过DISTINCT关键字进行去重。例如,以下SQL语句可以从u…

    database 2023年5月21日
    00
  • 通过缓存+SQL修改优雅地优化慢查询

    为了优雅地优化慢查询,我们可以采用缓存+SQL修改的方式。下面是完整的攻略流程: 查询慢的原因分析 首先需要确定查询慢的原因,比如是索引不当、查询语句不优化、数据量过大等。可以使用SQL性能分析工具进行分析,或者通过分析慢查询日志找出问题点,明确需要优化的具体数据表和查询语句。 添加优化索引 如果查询语句中的字段没有索引,可以考虑新增一个相关的索引。注意,索…

    database 2023年5月19日
    00
  • 10个MySQL性能调优的方法

    下面是“10个MySQL性能调优的方法”的完整攻略: 1. 选择适当的数据类型 MySQL支持的数据类型很多,不同的数据类型对性能的影响也是不同的。因此,在设计数据表时,应该选择适当的数据类型。 例如,对于一列存储年龄的数据,使用TINYINT就足够了,而不必使用INT或BIGINT。这样可以减少存储空间,提高查询效率。 2. 添加合适的索引 索引可以提高查…

    database 2023年5月19日
    00
  • oracle数据库关于索引建立及使用的详细介绍

    Oracle数据库索引建立及使用详解 什么是数据库索引 数据库索引是一种用于提高数据库查询速度的数据结构,可以理解为一本书的目录,它记录着数据在表中的物理存储位置,可以加快数据查询的速度。 为什么需要数据库索引 在处理大量数据时,系统效率会受到很大影响。如果没有索引,每次数据查询都需要遍历整个表格,效率会非常低下。有了索引,查询时直接从索引中获取需要的数据的…

    database 2023年5月21日
    00
  • Linux下安装PHP MSSQL扩展教程

    下面是“Linux下安装PHP MSSQL扩展教程”的完整攻略。 准备工作 在安装 MSSQL 扩展之前必须先安装好其所依赖的环境。 安装FreeTDS FreeTDS是一个能够让 Linux 或类 Unix 系统作为客户端连接到远程的 MSSQL 或 Sybase 服务器的桥梁。 下载源码包: wget ftp://ftp.freetds.org/pub/…

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