楼主: 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
21#
 楼主| 发表于 2008-3-17 14:38 | 只看该作者
原帖由 kkngisn 于 2008-3-17 14:30 发表


http://www.itpub.net/thread-955276-1-1.html


  隐约记得数据块被放到BUFFER的地址中是根据数据块的位置然后做一个什么MOD的动作



你说的这个和我这个是不同的事情

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:34灰彻蛋
日期:2011-05-25 09:41:35ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
22#
发表于 2008-3-17 14:43 | 只看该作者
原帖由 eagle_fan 于 2008-3-17 14:38 发表



你说的这个和我这个是不同的事情


啊,有什么不同呢?

  你的数据在做HASH之前,都应该读到内存的HASH链表里面,而某个数据块具体在哪个HASH链表上是由这个数据块的地址决定的

  请指教  

使用道具 举报

回复
招聘 : 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
23#
发表于 2008-3-17 14:45 | 只看该作者
原帖由 d.c.b.a 于 2008-3-17 14:26 发表
从Access & Filter这儿看不出东东?

当然能看到:
Predicate Information (identified by operation id):
---------------------------------------------------
  
   2 - access("A"."SITE_ID"="B"."SITE_ID")    
    filter("A"."CATEGORY"="B"."FROM_CAT" OR
              "A"."CATEGORY2"="B"."FROM_CAT")
   4 - filter("A"."SALE_END">=SYSDATE@!)

使用道具 举报

回复
论坛徽章:
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
24#
 楼主| 发表于 2008-3-17 14:52 | 只看该作者
原帖由 anlinew 于 2008-3-17 14:45 发表

当然能看到:
Predicate Information (identified by operation id):
---------------------------------------------------
  
   2 - access("A"."SITE_ID"="B"."SITE_ID")   
    filter("A"."CATEGORY"="B"."FROM_CAT" OR
              "A"."CATEGORY2"="B"."FROM_CAT")
   4 - filter("A"."SALE_END">=SYSDATE@!)


这是一个很好的补充,Hash Join操作所对应的access列信息应该就是hash table的key值

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
25#
发表于 2008-3-17 14:58 | 只看该作者
不错

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
26#
发表于 2008-3-17 15:40 | 只看该作者
原帖由 eagle_fan 于 2008-3-17 14:29 发表


我们在tuning sql的时候可以站在oracle的角度想问题

起初我认为oracle应该更加smart一点,可以通过small_table(from_cat,site_id)来建立build table,然后在probe big_table的时候计算出两个hash值,第一个值基于(category, site_id),第二个值基于(category2,site_id)然后根据这两个hash值选择相应的bucket做链表扫描,这样的话FTS只需要一次

可惜oracle让我失望了,并没有如我一般的smart ,所以两次FTS无法避免


你对 Oracle要求高了点 D
下面的似乎也是使用了 CONCATENATION   , 没办法
select /*+ leading(b) use_hash(a b) */ distinct a.ID
from BIG_TABLE a, SMALL_TABLE b
where (b.from_cat||' '|| b.site_id)=any (a.category||' '||a.site_id,a.category2||' '||a.site_id )
and a.sale_end >= sysdate;

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
27#
发表于 2008-3-17 15:43 | 只看该作者
给大家很好的启示:rose

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:34灰彻蛋
日期:2011-05-25 09:41:35ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
28#
发表于 2008-3-17 16:18 | 只看该作者
原帖由 rollingpig 于 2008-3-17 15:40 发表


你对 Oracle要求高了点 D
下面的似乎也是使用了 CONCATENATION   , 没办法
select /*+ leading(b) use_hash(a b) */ distinct a.ID
from BIG_TABLE a, SMALL_TABLE b
where (b.from_cat||' '|| b.site_id)=any (a.category||' '||a.site_id,a.category2||' '||a.site_id )
and a.sale_end >= sysdate;



版主,请教一个问题

   数据块在数据链中的存储是  这个数据块的物理地址做一个HASH运算,这样连续的数据块都被放到不

同的数据链中。并且LZ说了他的表 ‘由这一点想到这个Hash Table所依赖的hash key的distinct value可能太少,重复值太多。’。觉得这个说法和ORACLE的数据块的分布相矛盾

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
29#
发表于 2008-3-17 16:41 | 只看该作者
此Hash 非彼 Hash

LZ说的hash key的指的是table内的数据值!!当然可能重复

使用道具 举报

回复
论坛徽章:
14
生肖徽章2007版:蛇
日期:2008-03-24 17:16:29生肖徽章2007版:猴
日期:2009-02-09 15:03:45生肖徽章2007版:猪
日期:2009-03-16 10:15:58生肖徽章2007版:龙
日期:2009-03-27 12:02:52生肖徽章2007版:虎
日期:2009-04-15 17:44:55
30#
发表于 2008-3-17 16:56 | 只看该作者
学习了

使用道具 举报

回复

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

本版积分规则 发表回复

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