前言

客户说:

我在数据库上继续运行昨日的脚本,但发现有个子过程在运行10个小时后报错:

烦请协助看看。。。

错误码是:ORA-01555: snapshot too old: rollback segment number 6 with name “_SYSSMU6$” too small

ORA-02063: preceding line from CLONE

分析

发生ORA-01555错误,一般是因为数据库内部,有长SQL在运行,运行时间超过undo保存数据的时间。Clone库undo保存数据的时间为:18000s。

根据错误提示,找到对应的SQL:

INSERT INTO   L_T_EDRSMT_RVII
SELECT DISTINCT T1.topactualid,
T1.INTERMEDIARYCODE,
T1.INTERMEDIARYTYPE,
nvl(tt.policypremiumchange, 0) / 100 *
(nvl(t1.commissionrate, 0) / 100) *
nvl(T3.EXECHANGERATE, 100) AS COMMISSIONAOMUNT
-- SUM(NVL(T1.COMMISSIONAOMUNT, 0) / 100 * nvl(T3.EXECHANGERATE, 100)) AS COMMISSIONAOMUNT
FROM tcsa.ROLE_V_INTERMEDIARYINFO T1
INNER JOIN tcsa.role_v_premiuminvolved tt
ON t1.topactualid = tt.topactualid
INNER JOIN circ_audit.L_T_EDRSMT_01 LT
ON LT.topactualid = T1.topactualid
LEFT OUTER JOIN tcsa.Uccexchange T3
ON T1.CURRENCYCODE = T3.EXCHANGECURRENCY
AND TO_CHAR(t3.issuancedate, 'YYYYMMDD') =
TO_CHAR(LT.T_INSRNC_BGN_TM, 'YYYYMM') || '01'
AND T3.basecurrency = '$$100001000001' 执行计划:
Plan hash value: 343405098 --------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Inst |IN-OUT|
--------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 26 | 156K| | 6378 (1)| 00:01:17 | | |
| 1 | HASH UNIQUE | | 26 | 156K| | 6378 (1)| 00:01:17 | | |
|* 2 | HASH JOIN OUTER | | 26 | 156K| | 6377 (1)| 00:01:17 | | |
| 3 | VIEW | | 1 | 6058 | | 5598 (1)| 00:01:08 | | |
|* 4 | HASH JOIN | | 1 | 6123 | | 5598 (1)| 00:01:08 | | |
| 5 | NESTED LOOPS | | 1 | 6097 | | 5596 (1)| 00:01:08 | | |
| 6 | MERGE JOIN CARTESIAN | | 1 | 6071 | | 5593 (1)| 00:01:08 | | |
| 7 | NESTED LOOPS | | 1 | 6058 | | 1 (100)| 00:00:01 | | |
| 8 | VIEW | ROLE_V_INTERMEDIARYINFO | 100 | 589K| | 1 (100)| 00:00:01 | | |
| 9 | REMOTE | | | | | | | CLONE | R->S |
| 10 | TABLE ACCESS BY INDEX ROWID| L_T_EDRSMT_01 | 1 | 26 | | 0 (0)| 00:00:01 | | |
|* 11 | INDEX RANGE SCAN | IDX_L_T_EDRSMT_01_01 | 1 | | | 0 (0)| 00:00:01 | | |
| 12 | BUFFER SORT | | 370K| 4702K| | 5593 (1)| 00:01:08 | | |
| 13 | REMOTE | POLICY | 370K| 4702K| | 5592 (1)| 00:01:08 | CLONE | R->S |
| 14 | REMOTE | PREMIUMINVOLVED | 1 | 26 | | 3 (0)| 00:00:01 | CLONE | R->S |
| 15 | VIEW | | 100 | 2600 | | 1 (100)| 00:00:01 | | |
| 16 | REMOTE | | | | | | | CLONE | R->S |
|* 17 | VIEW | | 31006 | 3512K| | 778 (1)| 00:00:10 | | |
|* 18 | WINDOW SORT PUSHED RANK | | 31006 | 2815K| 6632K| 778 (1)| 00:00:10 | | |
| 19 | REMOTE | UCCEXCHANGE | 31006 | 2815K| | 111 (1)| 00:00:02 | CLONE | R->S |
-------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access(TO_CHAR("ISSUANCEDATE"(+),'YYYYMMDD')=TO_CHAR(INTERNAL_FUNCTION("LT"."T_INSRNC_BGN_TM"),'YYYYMM')||'01' AND
"T1"."CURRENCYCODE"="EXCHANGECURRENCY"(+))
4 - access("B"."ACTUALID"="A"."ROLEID")
11 - access("LT"."TOPACTUALID"="T1"."TOPACTUALID")
17 - filter("RN"(+)=1)
18 - filter(ROW_NUMBER() OVER ( PARTITION BY "T_RMB"."BASECURRENCY","T_RMB"."EXCHANGECURRENCY",TO_DATE(TO_CHAR(INTERNAL_FUNC
TION("T_RMB"."ISSUANCEDATE"),'yyyymmdd'),'yyyymmdd') ORDER BY "STATUS")<=1)

观察执行计划,发现id=6处关键字为MERGE JOIN CARTESIAN,也就是笛卡尔积

笛卡儿积一般发生在: 两个表关联没有连接条件的时候就会产生笛卡尔笛卡儿积,这种表连接方式就叫笛卡尔笛卡儿连接。

笛卡尔连接会返回两个表的乘积。A有100行数据,B有14行数据,两个表进行笛卡尔连接之后会返回1400行数据

那在这个执行计划中,为什么优化器会选择笛卡尔积连接呢?

因为Id=7返回的Rows被优化器错误的估算为1行,优化器认为1行的表与任意大小的表进行笛卡尔关联,数据也不会翻翻,优化器认为这是安全的。所以这里优化器选择了笛卡尔连接。

ID = 7 为NEST LOOPS 内连接嵌套循环关联方式,所关联的两张表为ROLE_V_INTERMEDIARYINFOL_T_EDRSMT_01

优化器错误认为L_T_EDRSMT_011条数据,两表关联,进行内连接,数据量肯定是返回1行。 而实际上,我们在数据库中查询此表,发现数据量有16549行数据



所以说此处执行计划是错误的

但是为什么,优化器会认为L_T_EDRSMT_01为1条数据呢?

因为数据库统计信息收集的不准。但是为什么收集的不准?

因为运行此存储过程SP_AUDIT_T_EDRSMT之前,恰好这张表L_T_EDRSMT_01的数据为0。每天晚上10点数据库内部定时,收集统计信息时,也就把表的的统计信息收集为0了。

优化方法

重新收集统计信息

BEGIN
DBMS_STATS.gather_schema_stats(ownname => 'CIRC_AUDIT',
estimate_percent => 30,
method_opt => 'for all columns size repeat',
no_invalidate => FALSE,
degree => 4,
granularity => 'ALL',
cascade => TRUE);
END;
/

收集完成后,该SQL能在10分钟内运行完成。

一次ORA-01555问题分析,及SQL优化。的更多相关文章

  1. mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化

    基础篇:MySql架构与存储引擎 逻辑架构图: 连接层: mysql启动后(可以把mysql类比为一个后台的服务器),等待客户端请求,当请求到来后,mysql建立一个一个线程处理(线程池则分配一个空线 ...

  2. SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

  3. mysql 开发进阶篇系列 2 SQL优化(explain分析)

    接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...

  4. MySQL 使用profile分析慢sql,group left join效率高于子查询

    MySQL 使用profile分析慢sql,group left join效率高于子查询 http://blog.csdn.net/mchdba/article/details/54380221 -- ...

  5. sql优化 慢查询分析

    查询速度慢的原因很多,常见如下几种 SQL慢查询分析 转自:https://www.cnblogs.com/firstdream/p/5899383.html 1.没有索引或者没有用到索引(这是查询慢 ...

  6. SQL优化之索引分析

    索引的重要性 数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Ind ...

  7. SQL优化-如何分析性能瓶颈

    MySQL优化一览图 笔者将优化分为了两大类:软优化和硬优化.软优化一般是操作数据库即可:而硬优化则是操作服务器硬件及参数设置. 1.软优化 1)查询语句优化 首先我们可以用EXPLAIN或DESCR ...

  8. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  9. sql查询速度慢分析及如何优化查询

    原因分析后台数据库中数据过多,未做数据优化数据请求-解析-展示处理不当 网络问题提高数据库查询的速度方案SQL 查询速度慢的原因有很多,常见的有以下几种:1.没有索引或者没有用到索引(查询慢最常见的问 ...

  10. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...

随机推荐

  1. python之对堆栈、队列处理操作(转载+个人看法)

    参考链接:https://blog.csdn.net/u010786109/article/details/40649827 python实现堆栈操作 堆栈是一个后进先出的数据结构,其工作方式就像一堆 ...

  2. Miller&&Pollard POJ 1811 Prime Test

    题目传送门 题意:素性测试和大整数分解, N (2 <= N < 254). 分析:没啥好讲的,套个模板,POJ上C++提交 收获:写完这题得到模板 代码: /************** ...

  3. Linux环境下HDFS集群环境搭建关键步骤

    Linux环境下HDFS集群环境搭建关键步骤记录. 介质版本:hadoop-2.7.3.tar.gz 节点数量:3节点. 一.下载安装介质 官网下载地址:http://hadoop.apache.or ...

  4. CentOS 7 下配置 firewalld(firewall-cmd)实现 NAT 转发 软路由

    如果配合 DHCP 服务或实现更多功能. ☼ NAT 转发软路由 开启 NAT 转发之后,只要本机可以上网,不论是单网卡还是多网卡,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器 ...

  5. EL表达式、JSTL

    EL表达式 一.简介 > JSP表达式 <%= %> 用于向页面中输出一个对象.        > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段.   ...

  6. Godaddy域名301跳转问题处理

    前言:Godaddy的域名301跳转一共有六步,详情见以下步骤: 第一步: 第二步:找到你的域名,并点击DNS 第三步:点击添加 第四步:添加解析ip地址 第五步:域名转址,也就是301跳转 第六步: ...

  7. R in action读书笔记(11)-第八章:回归-- 选择“最佳”的回归模型

    8.6 选择“最佳”的回归模型 8.6.1 模型比较 用基础安装中的anova()函数可以比较两个嵌套模型的拟合优度.所谓嵌套模型,即它的一 些项完全包含在另一个模型中 用anova()函数比较 &g ...

  8. 新奇:(nodejs兄弟)用HTML + FLASH +JS 也可以写桌面EXE。

    首先看下面这张图片,下面的所有界面都是用html代码实现的. 编程IDE:vb6.0 使用控件:WEBBROWSER 原理:使用olelib 让程序继承:IDocHostUIHandler 和 ICu ...

  9. iOS-UI控件之UITableView(四)- cell数据刷新

    TableView- 数据刷新 数据刷新 添加数据 删除数据 更改数据 全局刷新方法(最常用) [self.tableView reloadData]; // 屏幕上的所有可视的cell都会刷新一遍 ...

  10. HDU_1710_二叉树前序中序确定后序

    2018-3-6 按照王道机试书上的思路再做了一遍,先根据先序和中序建树,然后后序遍历. 静态分配数组用于建树,可以返回数组地址当作结点指针. #include<iostream> #in ...