一个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 ...
随机推荐
- hadoop_集群安装_1
这篇文章中主要介绍的是,如何基于VM安装Linux,以及如何在安装好Linux之后,基于操作系统安装VMTools. 在安装之前,应该先规划好 每个node*的IP地址,以及 hostname: no ...
- Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法
Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...
- VC中动态添加控件
VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...
- O-C相关-09-id 类型与应用
09-id 类型与应用 1, 使用 NSObject 访问子类对象方法 代码在编辑的时候, Xcode 会实时检查语法情况. 如果调用某个对象的方法, 在声明中没有该方法的声明, 那么就会报错. 但是 ...
- html-----008
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 10.15_SVG可以解决问题吗
(1)淘宝开放平台. (2)Teiid是一个数据虚拟化系统.Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架.Apache Jackrabbit. (3)SVG:百度百科.SVG.js .Sn ...
- HDU 1176 免费馅饼(数字三角形)
免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...
- linux管理网络连接指令
ethtool eth0 查看 eth0对应网卡的设置 ethtool -i eth0 查看 eth0网卡的驱动信息 ethtool -S eth0 查看网卡的统计信息 ethtool -s eth ...
- CentOS7修改网卡为eth0
CentOS7修改网卡为eth0 1.编辑网卡信息 [root@linux-node2~]# cd /etc/sysconfig/network-scripts/ #进入网卡目录 [root@lin ...
- SQL Cursor(游标)
1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要 ...