关于sql_profile中的绑定变量

使用sql_profile来调优一些紧急的性能sql可以起到立竿见影的效果,如果sql语句本身结构就很清晰,简单,略作修改就能得到调优后的sql语句。
但是如果语句中含有绑定变量,如果要得到调优后的sql_id就有些困难了。
比如我们存在下面的sql语句。
SELECT NVL(SUM(CUST.WEIGHT), 0) TOTAL_WEIGHT
  FROM BL1_CUSTOMER CUST, BL1_CYCLE_CUSTOMERS CYC_CUST
 WHERE CYC_CUST.PERIOD_KEY = :periodKey
   AND CYC_CUST.CYCLE_SEQ_NO = :cycleSeqNo
   AND CYC_CUST.CUSTOMER_NO = CUST.CUSTOMER_ID
   AND (CYC_CUST.UNDO_REQ_TYPE = 'N' OR CYC_CUST.UNDO_REQ_TYPE IS NULL)
   AND EXISTS
 (SELECT 1
          FROM BL1_CYC_PAYER_POP PAYER, BL1_DOCUMENT DOC
         WHERE PAYER.PERIOD_KEY = :periodKey
           AND PAYER.CYCLE_SEQ_NO = :cycleSeqNo
           AND PAYER.CYCLE_SEQ_RUN = :cycleSeqRun
           AND PAYER.CUSTOMER_NO = CYC_CUST.CUSTOMER_NO
           AND PAYER.DB_STATUS = 'BL'
           AND (PAYER.UNDO_REQ_TYPE = 'N' OR PAYER.UNDO_REQ_TYPE IS NULL)
           AND PAYER.FORMAT_EXT_DATE IS NULL
           AND DOC.PERIOD_KEY = :periodKey
           AND DOC.CYCLE_SEQ_NO = :cycleSeqNo
           AND DOC.CYCLE_SEQ_RUN = :cycleSeqRun
           AND PAYER.BA_NO = DOC.BA_NO
           AND doc.DOC_PRODUCE_IND IN ('Y', 'E'))

需要添加一个hint 得到一个新的sql_id.
SELECT NVL(SUM(CUST.WEIGHT), 0) TOTAL_WEIGHT
  FROM BL1_CUSTOMER CUST, BL1_CYCLE_CUSTOMERS CYC_CUST
 WHERE CYC_CUST.PERIOD_KEY = :periodKey
   AND CYC_CUST.CYCLE_SEQ_NO = :cycleSeqNo
   AND CYC_CUST.CUSTOMER_NO = CUST.CUSTOMER_ID
   AND (CYC_CUST.UNDO_REQ_TYPE = 'N' OR CYC_CUST.UNDO_REQ_TYPE IS NULL)
   AND EXISTS
 (SELECT /*+ unnest parallel(payer,4) full(payer)*/1
          FROM BL1_CYC_PAYER_POP PAYER, BL1_DOCUMENT DOC
         WHERE PAYER.PERIOD_KEY = :periodKey
           AND PAYER.CYCLE_SEQ_NO = :cycleSeqNo
           AND PAYER.CYCLE_SEQ_RUN = :cycleSeqRun
           AND PAYER.CUSTOMER_NO = CYC_CUST.CUSTOMER_NO
           AND PAYER.DB_STATUS = 'BL'
           AND (PAYER.UNDO_REQ_TYPE = 'N' OR PAYER.UNDO_REQ_TYPE IS NULL)
           AND PAYER.FORMAT_EXT_DATE IS NULL
           AND DOC.PERIOD_KEY = :periodKey
           AND DOC.CYCLE_SEQ_NO = :cycleSeqNo
           AND DOC.CYCLE_SEQ_RUN = :cycleSeqRun
           AND PAYER.BA_NO = DOC.BA_NO
           AND doc.DOC_PRODUCE_IND IN ('Y', 'E'))

如果使用explain plan可以得到包含绑定变量的执行计划,但是却无法得到对应的sql_id
比如sql_id 为74pzzzjddkyd4 
74pzzzjddkyd4 SELECT NVL(SUM(CUST.WEIGHT), 0) TOTAL_WEIGHT FROM   BL1_CUSTOMER CUST        ,BL1_CYCLE_CUSTOMERS CY             
                        ...
              Q_TYPE IS NULL)   AND  EXISTS (SELECT 1                FROM   BL1_CYC_PAYER_POP PAYER
                     ...

使用explain plan for之后可以得到一个执行计划情况,但是sql_id却是不同的。
73d1q5xd835kt explain plan for
              SELECT NVL(SUM(CUST.WEIGHT), 0) TOTAL_WEIGHT
                ...
                 AND EXISTS
               (SELECT 1
                ...

对于这种情况,可以使用variable 来实现。
存在几个变量,然后手工赋值,执行一下,也可以中途停止,就能够从v$sql里面抓到对应的sql_id
variable periodKey number;
variable cycleSeqNo number;
variable cycleSeqRun number;
exec :periodKey:=61;
exec :cycleSeqNo:=4106;
exec :cycleSeqRun:=0;
然后执行修改后的语句,这样我们就得到了添加了Hint之后的sql语句。

如果我们需要修改的sql语句中的变量是:1 :2之类的,比如:
select  /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s p step) */
              ...
              s.WORKER  FROM TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step WHERE
              s.root2proc_inst = :1  AND s.step2step = step.objid AND ( NOT
              (step.step_type = 4)) AND ( s.assignee = 'BpmInServer'       OR
              s.assignee = 'BpmInServerSmThr'       OR s.assignee = 'BpmJms') AND
              s.committer is NOT NULL AND ( s.status in (50                    ))
这样通过variable就会出错了。只使用数字来作为变量还是不合规则的。
我们可以尝试使用如下的一个简单pl/sql来实现。
比如存在一个变量,我们就在 cursor中定义一个字段,存在多个变量就定义多个字段,最后在execute immediate的后面使用using子句来完成。
declare
cursor temp_cur is select '100' id from dual;
begin
for i in temp_cur loop
execute immediate 'select  /*+ leading(s) index(s TABLE_BPM_STEP_INST_1IX) use_nl(s step) */ 
s.ALLOW_CREATE, s.ASSIGNEE, s.ASYNC_RETURNED_PARAMS,
s.ATTACHER2STEP_INST, s.COMMITTER, s.CONTROL_COUNT,
s.CURR_FAULT2FAULT_INFO, s.DO_AVAIL_ON_RESUM, s.DO_FIN_ON_RESUM,
s.HAS_DEPENDENTS, s.HAS_MARCH_REND, s.HAS_REND, s.INFLOW_BITS,
s.ITER_COUNT, s.NUM_OR_PREREQS, s.NUM_PENDING, s.NUM_PENDING_PREREQS,
s.OBJID, s.OUTFLOW_BITS, s.PARAMS, s.PARENT2PROC_INST,
s.ROOT2PROC_INST, s.START_TIME, s.STATUS, s.STATUS_CHANGE_TIME,
s.STEP2STEP, s.TARGETED_BY_ALARMS, s.TRIGGERS_ALARMS, s.WAIT_TIME,
s.WORKER  FROM TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step WHERE
s.root2proc_inst = :1  AND s.step2step = step.objid AND ( NOT
(step.step_type = 4)) AND ( s.assignee = ''BpmInServer''       OR
s.assignee = ''BpmInServerSmThr''       OR s.assignee = ''BpmJms'') AND
s.committer is NOT NULL AND ( s.status in (50                    ))' using i.id;
end loop;
end;
/
通过v$sql即可得到对应的sql_id
目前自己使用的是这两种方式来解决绑定变量的问题,如果有更好的,希望拍砖。

时间: 2024-07-31 22:54:09

关于sql_profile中的绑定变量的相关文章

Oracle中如何绑定变量

oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析. 一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决. 之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改.当一个sql语句提交后,oracle会首先检查一下共享

[20121102]PLSQL中的绑定变量.txt

[20121102]PLSQL中的绑定变量.txt     以前曾经遇到一个sql语句提交给开发,开发没有找到,最终确定是问题语句在PLSQL中,实际上PLSQL转化为大写, 加上自己没有注意.实际上SQL语句在PLSQL中,一些好像被"格式化一样",我举一个例子: 1.测试环境: SQL> select * from v$version where rownum BANNER ---------------------------------------------------

关于pl/sql中的绑定变量

在看关于shared pool的文档时,必定会提到绑定变量,也能够通过几个简单的例子对绑定变量带来影响有深刻的认识,但是在工作中,可能有时候我们就忘了绑定变量的影响了,其实有时候一个很小的变动就会导致性能几十几百倍的提升. 简单用跟一个实例来说明. 我们先清空shared pool,排除其它的运行语句带来的影响. SQL>alter system flush shared_pool; 然后我们创建一个表t,使用cats的方式创建,只有2个字段.SQL>create table t as sel

oracel中sql语句和pl/sql语句使用绑定变量

关于绑定变量的用法: 之前的文章介绍了绑定变量对于系统的重要性,这里对绑定变量的使用做进一步的分析和说明. 1)在sql语句中如何带入bind value SQL> variable x number; SQL> exec :x:=100; PL/SQL procedure successfully completed. SQL> select * from t where id=:x; no rows selected SQL> exec :x:=101; SQL> sel

绑定变量及其优缺点

    绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能.然刀子磨的太快,使起来锋利,却容 易折断.凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已.本文讲述了绑定变量的使用方法,以及绑定变量的优缺点.使用场合.   一.绑定变量     提到绑定变量,就不得不了解硬解析与软解析.硬解析简言之即一条SQL语句没有被运行过,处于首次运行,则需要对其进行语法分析,语 义识别,跟据统计信息生成最佳的执行计划,然后对其执行.而软解析呢,

[20161002]绑定变量的分配长度6.txt

[20161002]绑定变量的分配长度6.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标. --一般如果绑定变量有多个字段在分配占用空间时长度变化,这样生成的子光标会增加. --我以前的测试字符串长度变化是32,32+96=128,32+96+1872=2000.也就是分4个段 1-32,33-128,129-2000,2001-4000. --相关链接: http://blog.itpub.net/267265/viewspace-1993495/ http:

Oracle获取绑定变量的各种方法

Oracle获取绑定变量的各种方法 当Oracle解析和执行含有绑定变量的目标SQL时,如果满足如下两个条件之一,那么该SQL中的绑定变量的具体输入值就会被Oracle捕获: l 当含有绑定变量的目标SQL以硬解析的方式被执行时. l 当含有绑定变量的目标SQL以软解析或软软解析的方式重复执行时,Oracle在默认情况下至少得间隔15分钟才会捕获一次.这个15分钟受隐含参数"_CURSOR_BIND_CAPTURE_INTERVAL"控制,默认值为900秒,即15分钟. SYS@orc

绑定变量优缺点、使用、绑定变量窥探、 Oracle自适应共享游标

绑定变量优缺点.使用.绑定变量窥探     绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中library cache的过度耗用以提高性能.然刀子磨的太快,使起来锋利,却容易折断.凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已.本文讲述了绑定变量的使用方法,以及绑定变量的优缺点.使用场合.   一.绑定变量     提到绑定变量,就不得不了解硬解析与软解析.硬解析简言之即一条SQL语句没有被运行过,处于首次运行,则需要对其进行语法分析,语义识别,跟据统计信息生成最佳的执行

应用-dw中,阶段变量添加后为什么绑定不显示

问题描述 dw中,阶段变量添加后为什么绑定不显示 ADODB.Command 错误 '800a0d5d' 应用程序在当前操作中使用了错误类型的值. /order_ch.asp,行 38 MM_editCmd.Parameters.Append MM_editCmd.CreateParameter(""param5"" 5 1 -1 MM_IIF(Request.Form(""price"") Request.Form(&quo