暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

shell中调用sql使用绑定变量举例

原创 杜伟 2024-12-06
110

最近发现数据库上有部分硬解析较高,现在的数据库服务器硬件性能都非常给力,大内存多核心,硬解析指标不是非常重要了,但是作为找茬的dba还要给应用上上课的,既然你这么用了就该用好。检查硬解析的语句如下:

--查看硬解析的具体语句
select a.sql_id,
       a.MODULE,
       a.PARSING_SCHEMA_NAME,
       a.last_active_time,
       a.last_load_time,
       a.sql_text,
       b.pool_mb,
       b.cnt
  from gv$sqlarea a,
       (select max(sql_id) sql_id,
               FORCE_MATCHING_SIGNATURE,
               round(sum(SHARABLE_MEM / 1024 / 1024)) pool_mb,
               count(1) cnt
          from gv$sqlarea
         where FORCE_MATCHING_SIGNATURE > 0
           and FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATURE
         group by FORCE_MATCHING_SIGNATURE
        having count(1) > 100
         order by count(1) desc) b
 where a.sql_id = b.sql_id  --and a.PARSING_SCHEMA_NAME !='SYS'
 order by cnt desc;

--根据快照查看快照期间的平均硬解析
with x as (select 
       c.instance_name,
       a.SNAP_ID,
       b.BEGIN_INTERVAL_TIME,
       b.END_INTERVAL_TIME,
       a.METRIC_NAME,
       round(a.AVERAGE, 2) AVERAGE
  from dba_hist_sysmetric_summary a,dba_hist_snapshot b,gv$instance c
 where a.SNAP_ID = b.SNAP_ID
   and b.instance_number=c.instance_number
   and a.instance_number=c.instance_number
   and a.INSTANCE_NUMBER = b.INSTANCE_NUMBER
   and a.METRIC_NAME in ('Hard Parse Count Per Sec')
   and round(b.BEGIN_INTERVAL_TIME,'hh24')>=trunc(sysdate-1,'dd')+7/24
   AND b.dbid = (SELECT dbid FROM v$database)
   and a.dbid=b.dbid)
select 
x.instance_name 实例,
x.SNAP_ID 采样号,
to_char(x.BEGIN_INTERVAL_TIME, 'yyyy-MM-dd HH24:mi:ss') 开始时间,
to_char(x.END_INTERVAL_TIME, 'yyyy-MM-dd HH24:mi:ss') 结束时间,
x.AVERAGE 平均硬解析次数
from x 
where round(BEGIN_INTERVAL_TIME,'hh24')>=trunc(sysdate-1,'dd')+7/24  
and round(BEGIN_INTERVAL_TIME,'hh24')<=trunc(sysdate,'dd')+1/24
order by x.snap_id;
 

根据以上脚本确认了具体硬解析语句,跟应用反馈,得到的结果是通过shell调用的sql,建议他们在shell使用变量的形式,避免sql执行时每次进行解析,并缓存sql相关信息。


#!/bin/bash

# Oracle数据库连接信息
ORACLE_SID=orcl
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db
ORACLE_USER=scott
ORACLE_PASSWORD=tiger
DATABASE_HOST=192.168.56.201
DATABASE_PORT=1521
DATABASE_SERVICE=orcl

# 要查询的变量值
search_value=$1

# 设置Oracle环境变量
export ORACLE_SID ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH

# 使用sqlplus连接数据库并执行SQL语句

p1=`sqlplus -s "${ORACLE_USER}/${ORACLE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_SERVICE}" <<-!!! 
set trim on;
set concat on;
set trimspool on;
set termout on;
set show off;
set echo off;
set head off;
set flush off;
set feedback off;
set linesize 2000

-- 使用绑定变量来避免硬解析,如果是number类型  VARIABLE bv_search_value varchar2(100);处varchar2(100)换成number即可
VARIABLE bv_search_value varchar2(100);
EXEC :bv_search_value := '$search_value';

SELECT *
FROM emp
WHERE ename = :bv_search_value;


EXIT;
!!!`

# 读取并显示查询结果

echo "$p1"

上面是在自己的环境下测试的,在数据库中调用的sql就是

SELECT *
FROM emp
WHERE ename = :bv_search_value;

满足使用绑定变量的要求。

最后修改时间:2024-12-06 10:01:17
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论