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

yizhihongxing

下面我就为您详细讲解一下“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日

相关文章

  • Java中JDBC事务与JTA分布式事务总结与区别

    Java中JDBC事务与JTA分布式事务总结与区别 1. JDBC事务 1.1 JDBC事务的定义 JDBC事务是指从JDBC连接开始,到结束提交或回滚的整个过程。JDBC事务采用的是本地事务的原理,即在一个本地数据库中进行的一组操作。 1.2 JDBC事务的使用步骤 JDBC事务的使用步骤如下: 获取连接:使用DriverManager.getConnec…

    database 2023年5月21日
    00
  • Linux下安装mysql 5.7.17.tar.gz的教程详解

    Linux下安装mysql 5.7.17.tar.gz的教程详解 准备工作 下载MySQL 5.7.17版本的压缩包(mysql-5.7.17.tar.gz)。 安装cmake和make工具。 sudo apt-get install cmake make 安装依赖库 sudo apt-get install build-essential libncurs…

    database 2023年5月22日
    00
  • Oracle 自增(auto increment) 或 标识字段的建立方法

    要在Oracle数据库中实现自增或者标识字段,可以使用序列(Sequence)对象来实现。 创建序列对象 要创建序列对象,可以使用以下SQL语句: CREATE SEQUENCE sequence_name MINVALUE value MAXVALUE value START WITH value INCREMENT BY value CACHE valu…

    database 2023年5月21日
    00
  • redis使用get key中文变成十六进制编码

    redis-cli 后面加上 –raw 解决中文显示问题   redis-cli -h 127.0.0.1 -p 端口 -a 密码  –raw 不带 –raw 参数: redis-cli -h 10.168.99.70 -p 6379 10.168.99.70:6379> set a “你好” OK 10.168.99.70:6379> g…

    Redis 2023年4月13日
    00
  • Linux下如何实现Mysql定时任务

    实现Mysql定时任务的方式有很多,包括使用crontab、使用Mysql事件调度器等方式。这里我们主要介绍在Linux下使用crontab方式实现Mysql定时任务的方法。 安装Mysql 首先需要在Linux系统上安装Mysql数据库,可以通过以下命令安装: sudo apt update sudo apt install mysql-server 创建…

    database 2023年5月22日
    00
  • 4D和AnzoGraph的区别

    4D和AnzoGraph都是目前比较流行的图数据库,但它们在设计理念、数据管理方式等方面存在一些差异。 1. 4D的设计理念 4D是一种基于对象的关系数据库,使用SQL语言进行查询和管理。在4D中,数据是以表格形式存储的,每个表格都可以包含多行数据和多个列。4D在数据管理方面有一定的优势,它提供了一些高级功能,如内置的报表生成和表单设计工具。 2. Anzo…

    database 2023年3月27日
    00
  • MySQL5.7.03 更换高版本到MySQL 5.7.17安装过程及发现问题解决方案

    MySQL5.7.03 更换高版本到MySQL 5.7.17安装过程及发现问题解决方案 背景 当我们需要进行数据库升级或者迁移时,需要将原有的版本更换到目标版本。本文将针对MySQL版本升级做出详细的说明。 步骤1:备份数据 在进行任何数据库升级操作之前,一定要先备份数据,避免数据丢失。可以使用以下命令进行备份: mysqldump -u <usern…

    database 2023年5月22日
    00
  • 理解MySQL变量和条件

    当我们使用MySQL时,变量和条件这两个概念是非常重要的。本文将详细讲解如何理解MySQL变量和条件,包含以下内容: MySQL变量的定义和使用 MySQL条件的概念和语法 两条MySQL变量和条件的示例说明 MySQL变量的定义和使用 MySQL变量是一个用于存储值的命名容器。你可以在程序中创建变量,给它赋一个值,然后在接下来的程序中使用这个值。 在MyS…

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