一个SQL,通过SPM固定它的执行计划,可以通过DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE实现。也可以通地此功能在不修改原SQL的情况下对其加HINT来固定执行计划。

DB VERSION:Oracle 11.2.0.4

OS:CentOS 6.6

例如:

原SQL走索引:

SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;

想通过加HINT让其走全表扫描:

SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;

在V$SQL中查询出,原SQL的SQL_ID=064qcdmgt6thw,加HINT的SQL的SQL_ID=ahdtbgvsd3bht,PLAN_HASH_VALUE=970476072。

执行以下:

DECLARE

CNT NUMBER;

V_SQL CLOB;

BEGIN

--得到原语句SQL文本

SELECT SQL_FULLTEXT INTO V_SQL FROM V$SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;

--用加HINT的SQL的SQL_ID和PLAN_HASH_VALUE,来固定原语句的SQL

CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => 'ahdtbgvsd3bht', PLAN_HASH_VALUE => 970476072, SQL_TEXT => V_SQL);

END;

这样就将加HINT的执行计划固定在原语句上。执行原语句,在V$SQL的PLAN_HASH_VALUE列和SQL_PLAN_BASELINE列来确认是否固定。

测试中发现,一些含有绑定变量的SQL,用常量的SQL的SQL_ID和PLAN_HASH_VALUE无法固定,此时可以尝试使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL。

例如:

DECLARE

V_SQL VARCHAR2(2881064151);

BEGIN

V_SQL := 'SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:1';

EXECUTE IMMEDIATE V_SQL

USING 10;

END;

var v number;

exec :v :=10

SELECT /*+FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;

Oracle 通过SQL PROFILE为SQL语句加HINT可参考:http://www.linuxidc.com/Linux/2015-05/116974.htm

更多Oracle相关信息见Oracle 专题页面 http://www.codesec.net/topicnews.aspx?tid=12

mysql execute immediate_使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL相关推荐

  1. mysql绑定变量的值_关于绑定变量的SQL绑定什么值

    当然这不是判断在哪里建立索引的依据. SELECT * FROM (SELECT A.*, SC.NAME, SC.POSITION AS "绑定变量在SQL语句中的位置", CA ...

  2. mysql 查询绑定变量_MySQL高级特性——绑定变量

    从MySQL 4.1 版本开始,就支持服务器端的绑定变量,这大大提高了客户端和服务器端数据传输的效率 介绍 当创建一个绑定变量 SQL 时,客户端会向服务器发送一个SQL语句的原型.服务器端收到这个S ...

  3. mysql中Prepare、execute、deallocate的使用方法

    mysql中Prepare.execute.deallocate的使用方法 PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用.准备好的SQL语句通过EXECUTE命令执 ...

  4. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  5. mysql题库随机抽取试题_Python从MySQL数据库中面抽取试题,生成试卷

    一.背景 本文章主要是分享如何使用Python从MySQL数据库中面抽取试题,生成的试卷每一份都不一样. 二.准备工作 1.安装Python3 2.安装库 pip install python-doc ...

  6. mysql 全局不重复_如何批量生成MySQL不重复手机号大表实例代码

    前言 在MySQL很多测试场景,需要人工生成一些测试数据来测试.本文提供一个构造MySQL大表存储过程,可以生成包含用户名,手机号码,出生日期等字段.也可以通过滤重来使得手机号码不重复,模拟现实场景. ...

  7. oracle execute immediate 游标,EXECUTE IMMEDIATE 常见使用方法

    在ORACLE的PL/SQL里: EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块. ...

  8. mysql手机号码不重复_如何批量生成MySQL不重复手机号大表实例代码

    前言 在MySQL很多测试场景,需要人工生成一些测试数据来测试.本文提供一个构造MySQL大表存储过程,可以生成包含用户名,手机号码,出生日期等字段.也可以通过滤重来使得手机号码不重复,模拟现实场景. ...

  9. mysql jdbc 绑定变量_jdbc测试mysql数据库sql预解析(绑定变量)

    jdbc测试mysql数据库sql预解析(绑定变量) 用习惯了oracle,学习mysql,想测试一下mysql绑定变量的效果.以前看网上介绍大部份都说mysql没有sql共享池的概念,所以也不存在s ...

最新文章

  1. centos8安装KVM/QEUM虚拟化
  2. 万变不离其中----SQL必记语法
  3. 利用sshpass实现ansible功能
  4. 一些技术社区关于博客内图片 markdown 源代码的字数统计
  5. 牛客题霸 [ 缺失数字] C++题解/答案
  6. java 数据库查询Date类型字段 没有了时分秒 全为 00 的解决办法
  7. 无限分级 层次输出 demo
  8. day4作业(基本运算流程if for)
  9. Python 分析Nginx 日志并存入MySQL数据库(单线程)
  10. mysql bigint 转int_技术分享 | MySQL ?删库不跑路(建议收藏)
  11. C++代码示例2 ~ 求立方体的面积和体积并求出两个立方体是否相等
  12. 图易服装PDM产品数据管理系统
  13. 【Docker】Docker下载与安装
  14. GeoServer发布Shapefile矢量数据
  15. 硬盘SMART监控工具Scrutiny
  16. 百度世界2020技术“大阅兵”背后的营销战役
  17. 将源码打包成deb软件包
  18. 苹果计算机如何显示错误,科普电脑打开苹果手机视频教程及Apple ID验证失败发生未知错误怎么解决...
  19. Mave概念及其配置
  20. 用vue2写一个新闻列表页,和新闻详情页,该怎么做?

热门文章

  1. 疫情影响企业发展能力?也许它能帮您摆脱困境
  2. cdf文件 mysql,在linux下用fortran读取netcdf文件(以WRF模式输出的数据为例)
  3. 2020年人生目标 随笔记录
  4. 2020年的总结和2021的目标
  5. 嵌入式开发模拟器:qemu使用,仿真多种方式启动内核kernel (超详细,tftp/nfs等方式)
  6. 解释java是值传递
  7. 各大网站视频自动播放代码(优酷、搜狐、酷6、土豆等)
  8. 聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含
  9. Walker智慧农业物联网云平台(Version:3.0.1)「源码」
  10. 美团点评2019年秋招部分编程题汇总 解题报告 Apare_xzc