V$sql查找未使用绑定变量的语句

简介: 前言: 由于各种原因(开发人员的技术水平、开发的管理规范、赶进度),系统在运行一段时间后,发现性能越来越慢。这时候往往是DBA发挥价值的时候到了,DBA通过查看数据库的AWR报告,如果发现以下值Library Hit、Soft Parse偏低(95%以下),Hard parses偏高。

前言:

由于各种原因(开发人员的技术水平、开发的管理规范、赶进度),系统在运行一段时间后,发现性能越来越慢。这时候往往是DBA发挥价值的时候到了,DBA通过查看数据库的AWR报告,如果发现以下值Library Hit、Soft Parse偏低(95%以下),Hard parses偏高。那就很有可能是数据库太多语句未使用绑定变量引起的。

DBA可以通过v$sq视图定期抓取一些未使用绑定变量的语句,并由开发进行相应的程序优化,逐步改善系统运行缓慢的问题;

一、查找方法:

从ORACLE10G开始,V$SQL视图中增加列FORCE_MATCHING_SIGNATURESignature used when the CURSOR_SHARING parameter is set to FORCE;(当CURSOR_SHARING参数设置成FORCE时,产生的执行计划是一样的)

测试1:cursor_sharing值为EXACT

SQL> show parameter cursor_sharing;

 

NAME             TYPE     VALUE

------------------------------------ ----------- ---------------------

cursor_sharing             string     EXACT

 

SQL>SELECT /*john*/* from bas.john where name='曹定芳';

 

SQL>SELECT /*john*/* from bas.john where name='张杰雄';

    

SQL>SELECT /*john*/* from bas.john where name='练为斌';

 

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql t where sql_text like '%john%';

 

SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE

---------------------------------------------------- --------------------- -----------------------------

SELECT /*john*/* from bas.john where name='曹定芳'    1.58728914732591E19     8.65016113461197E18

SELECT /*john*/* from bas.john where name='张杰雄'    1.58728914732591E19     1.55664749687513E19

SELECT /*john*/* from bas.john where name='练为斌'    1.58728914732591E19     6.34382341893161E18

 

测试1说明:当name值不一样的时候FORCE_MATCHING_SIGNATURE的值相同,而EXACT_MATCHING_SIGNATURE值不同,说明在cursor_sharing=force时,执行计划可共用;cursor_sharing=exact时,执行计划不可共用;我们使用绑定变量后,同样也可以达到执行计划共用的效果;

 

测试2:cursor_sharing值为FORCE

1、执行语句:alter system set cursor_sharing=force;

SQL> alter system set cursor_sharing=force;

 

System altered.

 

SQL> show parameter cursor_sharing;

 

NAME                 TYPE     VALUE

--------------------------- --------- -----------

cursor_sharing             string     FORCE

 

SQL> alter system flush shared_pool;

 

System altered.

 

2、同样执行三条查询语句

SQL>SELECT /*john*/* from bas.john where name='曹定芳';

 

SQL>SELECT /*john*/* from bas.john where name='张杰雄';

 

SQL>SELECT /*john*/* from bas.john where name='练为斌';

 

3、查找V$SQL的语句情况

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql t where sql_text like '%john%';

SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE

---------------------------------------------------- --------------------- -----------------------------

SELECT /*john*/* from bas.john where name=:"SYS_B_0"    1.58728914732591E19     1.58728914732591E19

测试2说明:当我们把cursor_sharing设置为force后,发现语句执行计划共用了,并且自动使用绑定变量(此时v$sql视图中只查询到一条与之相关的语句)

 

测试3cursor_sharing值为EXACT,但使用绑定变量

1、执行语句:alter system set cursor_sharing=EXACT;

SQL> alter system set cursor_sharing=force;

 

System altered.

 

SQL> show parameter cursor_sharing;

 

NAME                 TYPE     VALUE

--------------------------- --------- -----------

cursor_sharing             string     EXACT

 

SQL> alter system flush shared_pool;

 

System altered.

 

2、使用绑定变量查询

SQL>SELECT /*john*/* from bas.john where name=:a;    

 

3、查找V$SQL的语句情况

select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE from v$sql t where sql_text like '%john%';

 

SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE

---------------------------------------------------- --------------------- -----------------------------

SELECT /*john*/* from bas.john where name=:a     1.4513622515145E19     1.4513622515145E19

测试3总结:当我们把cursor_sharing设置为EXACT后,并通过绑定变量查询,发现语句执行计划共用了;

 

二、解决方法

通过以上测试已经了解:如果V$SQL里面的FORCE_MATCHING_SIGNATURE值一样的SQL语句,那么就可以通过绑定变量来进行相应的优化了。

select to_char(FORCE_MATCHING_SIGNATURE) as FORCE_MATCHING_SIGNATURE, count(1) as counts

from v$sql

where FORCE_MATCHING_SIGNATURE>0 and FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE

group by FORCE_MATCHING_SIGNATURE

having count(1) > &a

order by 2 desc;

 

找到语句后,剩下的工作就交给开发人员进行修改了,DBA又为整个系统性能的提高立了一大功。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技术博客:ORACLE 猎人笔记               数据库技术群:367875324 (请备注ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

相关文章
|
4月前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
2月前
|
SQL 运维 分布式计算
DataWorks产品使用合集之ODPPS中如何使用SQL查询从表中获取值并将其赋值给临时变量以供后续使用
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
SQL 存储 分布式计算
MaxCompute产品使用问题之odps sql如何定义变量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
102 0
|
3月前
|
SQL 缓存 Oracle
SQL调优之绑定变量用法简介
SQL调优之绑定变量用法简介
|
3月前
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
59 0
|
11月前
|
SQL 关系型数据库 MySQL
可以使用SQL语句来声明变量、设置自变量以及根据计算结果赋值
可以使用SQL语句来声明变量、设置自变量以及根据计算结果赋值
101 3
|
11月前
|
SQL 存储 关系型数据库
MySQL的第一篇文章——了解数据库、简单的SQL语句
MySQL的第一篇文章——了解数据库、简单的SQL语句
|
SQL 缓存 监控
为什么Oracle中包含绑定变量的SQL会有多个游标?(译文)
为了改进包含绑定变量的SQL的执行计划,Oracle在11g版本中引入了一项名为自适应游标共享(ACS,Adaptive Cursor Sharing)的新功能。
144 0
|
SQL Perl
PL/SQL编程—变量
PL/SQL编程—变量
83 0