系统中异常SQL的处理
以下是查询到的绑定变量值。您可以通过查看v$SQL _ bind _ capture视图来查看变量的实际值。如果时间很长,可以使用下面的语句查看历史绑定变量信息。
下面是打开autotrace选项追踪的手动执行,从执行效率上没有问题。
从执行计划和表的数据量来看,如果sql的开销有问题,应该会出现在表SAMS_CHECKINOUT上。让我们检查一下表上索引的创建语句,看看是否有问题。
下面是awr报告中看到的有问题的sql,是9个变量,属于应用前台的关联查询。sqlplus中手动检查的实际实现如下:
以下是查询到的绑定变量值。您可以通过查看v$SQL _ bind _ capture视图来查看变量的实际值。如果时间很长,可以使用下面的语句查看历史绑定变量信息。
下面是打开autotrace选项追踪的手动执行,从执行效率上没有问题。
从执行计划和表的数据量来看,如果sql的开销有问题,应该会出现在表SAMS_CHECKINOUT上。让我们检查一下表上索引的创建语句,看看是否有问题。
从上图可以看出,实际测试的执行计划与awr报告不同。
现在让我们测试sql。
/*+ gather_plan_statistics */收集的相关执行计划及其统计数据与该SQL的AWR报告中的执行计划不同,逻辑读取数也与AWR报告中的值有很大差异。所以为了更准确的判断问题,按照以下方法进行测试。
1,SQL在生产库(SAMS库的实例1,名为sams1)和SQLPLUS中执行。
2.执行后,在同一个SQLPLUS窗口中,立即执行以下命令:
结果如下:
1.在目录中创建一个脚本文件,以获取更多可信信息。
2.在SQLPLUS中,执行以下命令:@ SQL _ RPT 3271368959 1241142411599 va ABS 5 pt ktb。
4.执行后,在该目录下生成一个HTML文档,以获得所附sql统计表的更详细的数据信息。
初步分析如下:
1,这条SQL一次的逻辑读是11130,其中第37步的逻辑读是6127,占了一大半。这一步的操作是返回到表SAMS _检查输出,以获得四列的内容:“sc”,“检查时间”,“sc”。“sn”,“sc”。“in systime”[时间戳,11]根据上面获得的ROWID。
2.步骤38中SAMS _ I锁表的全表扫描也对整个SQL的逻辑读取贡献很大。但这不是重点。
此外,索引中还有两个概念:
1.创建新的复合索引或转换现有索引,并按以下顺序构建复合索引:
(BADGENUMBER,CHECKTIME,SN,VERIFYCODE,INSYSTIME)
2.使用以下列名称和顺序对表SAMS _ I锁创建复合索引:
(序列号,别名)
这两个指标暂时不创建,先从其他方面入手。
因为在测试期间,它生成的执行计划从未与AWR显示的执行计划一致过。所以这可能是无法模拟2亿次块逻辑读取的原因之一。因此,将有问题的SQL的执行计划绑定到测试SQL。然后执行测试SQL,观察分析测试SQL的执行过程和结果,以便进一步处理。
为了实现上述想法,我们需要使用ORACLE的SQL概要文件来更改其执行计划,而不更改SQL文本。操作方法如下:
1.在SQLPLUS中,为问题SQL生成创建SQL概要文件的脚本。脚本执行后,将要求您分别输入SQL_ID和PLAN_HASH_VALUE的值。而我们的问题SQL的SQL_ID是99vaabs5ptktb,PLAN_HASH_VALUE的值是4243346097。脚本执行后,将在SQLPLUS运行的当前目录中生成一个脚本文件。其名称显示在脚本执行结束时。为了描述方便,生成的S脚本文件简称为“问题SQL脚本”。
2.再次执行脚本,但是这次输入测试SQL的SQL_ID和PLAN_HASH_VALUE。它的SQL_ID是3kys9xsdjrm3b,PLAN_HASH_VALUE的值是561269195。为了描述方便,生成的脚本文件简称为“测试SQL脚本”。
3.在文本编辑工具中分别打开上述两个脚本,复制问题SQL脚本中下列特征词之间出现的词(不包括特征词)并覆盖测试SQL脚本中相同位置的原词:
h := SYS。ATTR广场(
………
……….
……….
:签名:= DBMS_SQLTUNE。SQL text _ TO _ SIGNATURE(SQL _ txt);
4.将测试sql脚本保存为一个文件(后缀为。SQL)。
5.在SQLPLUS中执行步骤4中保存的脚本。
6.在SQLPLUS中完整地执行原始测试SQL。(注意:执行前设置SQLPLUS格式,避免格式混淆。例如,设置行200设置页面大小100)
7.执行select * from table(DBMS _ xplan . display _ cursor('',' ',' all stats projection last ');
如果脚本正常生成,并且屏幕上没有出现错误消息,则脚本生成成功。例如,以下提示是正常的: