楼主: eagle_fan

[精华] 对Hash Join的一次优化

[复制链接]
论坛徽章:
27
授权会员
日期:2005-10-30 17:05:33管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36优秀写手
日期:2013-12-18 09:29:13马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
71#
 楼主| 发表于 2008-3-20 08:48 | 只看该作者
原帖由 rollingpig 于 2008-3-20 08:42 发表
正好相反,我说的是buffer_gets低,而CPU Time高(相对来说)


是我看错你前面的意思了

使用道具 举报

回复
论坛徽章:
7
2008新春纪念徽章
日期:2008-02-13 12:43:032010新春纪念徽章
日期:2010-03-01 11:19:07ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-04-19 12:30:19ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04双黄蛋
日期:2012-04-11 15:31:49ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14
72#
发表于 2008-3-20 09:39 | 只看该作者
原帖由 eagle_fan 于 2008-3-19 23:56 发表
其实想到问题可能出在hash key的时候已经基本解决了,hash join trace因为常常用,所以很自然就想到了 (建议大家熟练掌握,还有10032,10033 sort trace)

在实际调优中,index scan有问题的很多(index scan的access,filter估计大家都会注意到的[/PHP]



  能否举出几个例子?

使用道具 举报

回复
论坛徽章:
0
73#
发表于 2008-3-20 14:56 | 只看该作者
感觉这样的逻辑,SQL语句就不应该用DISTINCT写,而应该用EXISTS来做

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
74#
发表于 2008-3-20 15:14 | 只看该作者
原帖由 xjyxhm 于 2008-3-20 14:56 发表
感觉这样的逻辑,SQL语句就不应该用DISTINCT写,而应该用EXISTS来做

使用道具 举报

回复
论坛徽章:
0
75#
发表于 2008-3-20 15:16 | 只看该作者
还有一点就是,HASH连接过程中有动态角色互换,因此不应该用LEADING来指定那个表为驱动表哪个表为被探测表吧

使用道具 举报

回复
论坛徽章:
4
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53数据库板块每日发贴之星
日期:2008-03-19 01:04:392009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:20:51
76#
发表于 2008-3-20 16:23 | 只看该作者
经典!

使用道具 举报

回复
论坛徽章:
3
数据库板块每日发贴之星
日期:2008-01-10 01:04:53每日论坛发贴之星
日期:2008-03-30 01:01:55设计板块每日发贴之星
日期:2008-03-31 01:02:13
77#
发表于 2008-3-20 17:04 | 只看该作者
真不错啊好好学习一下

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
78#
发表于 2008-3-21 00:34 | 只看该作者
挺好的帖子

提问:

第一步建立Hash buckets时 Oracle是怎么把build_table的值影射到Hash buckets里的,每一个hash bucket里会有多少值?
难道像楼住这样得出来的么?
select count(*),col_name from build_table
group by col_name

谢谢

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:332011新春纪念徽章
日期:2011-02-18 11:43:36
79#
发表于 2008-3-21 10:10 | 只看该作者
通常情况下,我都是同时关注执行计划和统计信息,因为执行计划中的cost和card值貌似不太可靠(尤其是统计信息很旧了),所以统计信息是一个很好的参考。不过consistent read不能反映hash join的执行情况,像LZ这种问题,我就没有办法了,不过10104倒是一个不错的办法,之前都没有用过,以后再遇到这种问题,就多了一个办法了。

使用道具 举报

回复
论坛徽章:
27
授权会员
日期:2005-10-30 17:05:33管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36优秀写手
日期:2013-12-18 09:29:13马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
80#
 楼主| 发表于 2008-3-21 10:29 | 只看该作者
原帖由 foreverlee 于 2008-3-21 00:34 发表
挺好的帖子

提问:

第一步建立Hash buckets时 Oracle是怎么把build_table的值影射到Hash buckets里的,每一个hash bucket里会有多少值?
难道像楼住这样得出来的么?
select count(*),col_name from build_table
group by col_name

谢谢


oracle通过hash函数生成值hash(col_name) ,然后根据hash(col_name)投放相应的bucket

所以col_name值相同肯定会在同一个bucket里面,col_name值不同也可能出现在一个bucket里面,因为当col_name number of distinct value > number of buckets是,难免会出现一个篮子里面有多个鸡蛋的情况

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表