今天调测一个存储过程的时候发现一个sql神奇的吃掉了12G的临时表空间,最后还报临时表空间不足.
这个sql是一个3表关联的sql,表结构如下:
a (key number, a number)
b (key number, b number)
c (key number, c number)
a表有30W数据,b表有30W数据,c表只有2条记录
3个表都可以通过key字段关联,sql写成如下的时候出现了这种情况.
select /* + parallel(a,4) parallel(c,4) parallel(c,4) use_hash(a,b,c) */ a.key,b.b,b.c from a,b,c where a.key=b.key and c.key=b.key
查看执行计划后发现,a和b表走的是meger关联,而不是期待的hash关联.
在将sql调整为select /* + parallel(a,4) parallel(c,4) parallel(c,4) use_hash(a,b,c) */ a.key,b.b,b.c from a,b,c where a.key=b.key and c.key=b.key and b.key=c.key之后发现3个表都是使用了hash关联.这里我对oracle的解析就无法理解.
之后发生了一个更诡异的情况,当我把第一个sql复制到另外一台服务器在查看执行计划的时候发现这次居然没有在走merge的关联,而是用的hash关联,这让我对CBO的理解就更乱了,求大神帮忙分析下这个...