一个sql导致temp表空间爆掉
Buffer sort引发的血案
今天遇到的一个问题,在线系统上,有两张表,test1大概50G,test2大概200G,需要查询出来test1表中部分记录,并且这些记录不存在test2表中。于是就写了一个sql:
select t1.*
from test1 t1, test2 t2
where t1.col1 = t2.col1(+)
and t1.col2 = t2.col2(+)
and t1.col3 = t2.col3(+)
and t2.col1 is null;
因为是在线系统,考虑对系统的影响,这个就放到备库中去执行,而test1和test2这两张表又不在一个物理db上,所以就写了下面的sql:
select /*+ ordered use_hash(t,f) parallel(t 4) parallel(f 4) */ t1.*
from test1 t1, test2@remote_stb t2
where t1.col1 = t2.col1(+)
and t1.col2 = t2.col2(+)
and t1.col3 = t2.col3(+)
and t2.col1 is null;
分别打开两个物理备库,进行查询,结果出现了ORA-1652: unable to extend temp segment by 128 in tablespace TEMP。
分析原因:
考虑到使用hash join,先要构造test1的哈希表,test1表有50G,所以就在standby上增大了临时表空间,想着一定没有问题了,天不遂人愿,同样的错误又出现了,崩溃。于是就查看执行计划:
SQLPLAN
--------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS
1 0 SORT (AGGREGATE)
2 1 PX COORDINATOR
3 2 PX SEND (QC (RANDOM)) OF :TQ10002
4 3 SORT (AGGREGATE)
5 4 FILTER
6 5 HASH JOIN (OUTER)
7 6 PX RECEIVE
8 7 PX SEND (HASH) OF :TQ10001
9 8 PX BLOCK (ITERATOR)
10 9 TABLE ACCESS (FULL) OF test1
11 6 BUFFER (SORT)
12 11 PX RECEIVE
13 12 PX SEND (HASH) OF :TQ10000
14 13 REMOTE
临时表空间应该不是问题,所以推断应该是执行计划出来问题,查看执行计划,出现sort的地方就只有SORT (AGGREGATE)和BUFFER (sort),由于是count的计数,所以SORT (AGGREGATE)不会使用到排序空间,那只有BUFFER(sort)。于是上网上搜索,发现Lewis的一篇介绍BUFFER(sort)的博客:
http://jonathanlewis.wordpress.com/2006/12/17/buffer-sorts/
http://jonathanlewis.wordpress.com/2006/12/13/cartesian-merge-join/
里边有介绍buffer(sort)的内容。
但博客里没有找到灵感,后面再仔细的看一下,翻译下。不过最后问题的解决还是同事的提醒,在并发的时候,hash join会对探测表进行buffer sort,去掉并发的hint,sql最终跑了出来。究竟为什么并发的hash join会出现这样的情况,有待研究。
未完待续……
一个sql导致temp表空间爆掉的更多相关文章
- 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 昨天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅 ...
- ora-01652无法通过128(在temp表空间中)扩展temp段
有两种错误:1.数据表空间不足 2.临时表空间不足 有两种原因:一是临时表空间空间太小,二是不能自动扩展. 分析过程: 既然是temp表空间有问题,那当然就要从temp表空间说起啦.首先要说明的 ...
- Oracle Temp表空间切换
来源于: http://www.2cto.com/database/201507/418564.html 一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时 ...
- 直接删除undo及temp表空间文件后的数据库恢复一例
前几天,某用户研发找到我,说他们的研发库坏了,问我能恢复不?我问他们做了什么操作,一个小男孩儿说,看到空间满了,清除了点儿数据,我说是不是连数据库的文件也清除了,他说没有,他清除的是ORACLE_HO ...
- Oracle 临时表空间 temp表空间切换
一.TEMP表空间 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当oracle里需要用到sort的时候,PGA中sort_ar ...
- Oracle Temp 表空间切换
一.TEMP表空间作用 暂时表空间主要用途是在数据库进行排序运算.管理索引.訪问视图等操作时提供暂时的运算空间,当运算完毕之后系统会自己主动清理.当 oracle 里须要用到 sort 的时候. PG ...
- Oracle开发:创建一个用户并分配表空间和分配权限
-- 创建一个用户并分配表空间和分配权限 -- 以sysdba登录 oracle@sha-col-oracle-2:~> sqlplus / as sysdba SQL*Plus: Releas ...
- [转] 使用SQL脚本查看表空间使用率和使用dba_tablespace_usage_metrics视图的差别
传统的SQL脚本查看表空间使用率,使用的关键视DBA_DATA_FILE和DBA_FREE_SPACE. Oracle 11g引入了DBA_TABLESPACE_USAGE_METRICS视图.其实, ...
- temp表空间被过多占用处理方法
这个步骤比较简单,查询v$sort_usage就可以了: (select username,session_addr,sql_id,contents,segtype,blocks*8/1024/102 ...
随机推荐
- C语言study一
之前看了CPP,敲过些代码,但总觉得学得不够系统,书后面的习题比较无聊,不想去写.C主要在学数据结构和理解底层上面很有帮助. 于是又来mooc学习C语言,看了下视频虽然很繁琐啰嗦,但是有些东西我确实以 ...
- php模板引擎
http://baike.baidu.com/link?url=HmXfdJBv3zpCdnZPeaSmZmqDBHlyTBnz9Rmb5it-jf1_NLHfaku6_i8ssUYbnaTQEBD4 ...
- Eclipse 配置SSH 详解
http://blog.csdn.net/binyao02123202/article/details/18446523 最近看了很多招聘,其中很多我想去的公司都需要一些技能,其中熟练 Java SS ...
- TMemIniFile 与TIniFile 区别
在uses 申明 Inifiles MyStream:TMemIniFile; MyStream:=TMemIniFile.Create('c:\proxy.ini'); memo1.Text:=My ...
- onMouseDown onMouseUp onMouseMove(移动鼠标图像大小变化)
- Codevs 1814 最长链
1814 最长链 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少, ...
- session绑定线程
- Linux 经典面试题
[Linux 经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...
- absolute之实现居中的三种方式
居中思想可以由很多方式实现,这篇文章采用absolute实现:由传统方式开始到absolute独立使用方式 方式一:传统方式,父容器relateive,子元素absolute,然后left:50%,再 ...
- jquery 中fadeIn,fadeOut动画
我们在做首页banner图片播放的时候会使用fadeIn,fadeOut动画,这里需要注意的是: fadeIn作用相当于:display:list-item;opcity逐渐变为1 fadeOut作用 ...