楼主: eagle_fan

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

[复制链接]
论坛徽章:
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
61#
发表于 2008-3-19 14:40 | 只看该作者
实际上还有一个很明显的指标,就是CPU Time 与 buffer_gets 的比值明显高于普通的select操作。证明有异常的计算正在进行。

使用道具 举报

回复
论坛徽章:
3
2011新春纪念徽章
日期:2011-02-18 11:43:34灰彻蛋
日期:2011-05-25 09:41:35ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
62#
发表于 2008-3-19 14:52 | 只看该作者
原帖由 rollingpig 于 2008-3-19 14:40 发表
实际上还有一个很明显的指标,就是CPU Time 与 buffer_gets 的比值明显高于普通的select操作。证明有异常的计算正在进行。



--------------------------------------------------------------------------
| Id  | Operation            |  Name        | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |     2 |   174 |    18  (17)|
|   1 |  SORT UNIQUE         |              |     2 |   174 |    18  (17)|
|*  2 |   HASH JOIN          |              |     2 |   174 |    17  (12)|
|   3 |    TABLE ACCESS FULL | SMALL_TABLE  |  1879 | 48854 |    14   (8)|
|*  4 |    TABLE ACCESS FULL | BIG_TABLE    |     4 |   244 |     3  (34)|
--------------------------------------------------------------------------

   没有感觉CPU有多高。。。。。

使用道具 举报

回复
论坛徽章:
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
63#
发表于 2008-3-19 15:02 | 只看该作者
不是看PLAN的cost , 看实际执行结果

使用道具 举报

回复
招聘 : 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
64#
发表于 2008-3-19 15:12 | 只看该作者
原帖由 adamyang 于 2008-3-19 14:29 发表


执行计划你不看access path?JOIN不看连接基数不看join key?

不过楼主结论都出来了,在说什么没意思了。

提醒大家处理一类问题的比较好的方式和顺序而已。


楼主先就没看,不然也不会费劲去dump。。。。

使用道具 举报

回复
招聘 : 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
65#
发表于 2008-3-19 15:20 | 只看该作者
原帖由 rollingpig 于 2008-3-19 14:40 发表
实际上还有一个很明显的指标,就是CPU Time 与 buffer_gets 的比值明显高于普通的select操作。证明有异常的计算正在进行。


然后凭经验直接判断问题出在or上,噼里啪啦一改sql,完事。。。。
不看什么access也无需dump,对咱们看客来说啥意思也没有,更别说精华了

使用道具 举报

回复
论坛徽章:
151
2014年新春福章
日期:2014-04-17 11:38:13奥运会纪念徽章:皮划艇静水
日期:2012-07-31 15:42:58奥运会纪念徽章:田径
日期:2012-07-10 16:21:10奥运会纪念徽章:跆拳道
日期:2012-06-20 22:07:29奥运会纪念徽章:皮划艇静水
日期:2012-06-16 02:55:21奥运会纪念徽章:曲棍球
日期:2012-06-13 10:09:19蛋疼蛋
日期:2012-05-19 23:20:41迷宫蛋
日期:2012-05-16 17:35:25版主2段
日期:2012-05-15 15:24:11双黄蛋
日期:2012-03-19 19:34:04
66#
发表于 2008-3-19 15:29 | 只看该作者
靠,这是讨论技术问题还是讨论RPWT

使用道具 举报

回复
招聘 : 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
67#
发表于 2008-3-19 15:34 | 只看该作者
原帖由 blue_prince 于 2008-3-19 15:29 发表
靠,这是讨论技术问题还是讨论RPWT

建议DCBA想办法dump一下巴乔,看看到底有没有RPWT

使用道具 举报

回复
论坛徽章:
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
68#
 楼主| 发表于 2008-3-19 23:56 | 只看该作者
其实想到问题可能出在hash key的时候已经基本解决了,hash join trace因为常常用,所以很自然就想到了 (建议大家熟练掌握,还有10032,10033 sort trace)

在实际调优中,index scan有问题的很多(index scan的access,filter估计大家都会注意到的),hash key有问题的很少遇到,所以导致对hash join的filter信息不是很敏感

也许有人有问题,distinct value很少的build table很多啊,是不是都有这个问题呢?

答案是否定的

这个case独特的地方在于他还有另外一个join列from_cat,如果没有from_cat这个join列,这个hash join的性能是没有问题的

因为落在site_id=0这个bucket里面的行不需要来做from_cat上的filter,直接和链表头匹配成功就结束了,不需要扫描整个linked list

所以也不是说linked list很长就一定会有问题,明白了原理具体情况具体分析

OR也许不常见,更常见的SQL也许是像下面这种的:

[PHP]

SQL> explain plan for select /*+ use_hash(a,b) leading(b) */ a.id
  2  from big_table a,small_table b
  3  where a.site_id=b.site_id and a.category > b.from_cat
  4  ;

Explained.

SQL> @?/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------
| Id  | Operation            |  Name        | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |    94 |  6110 |    17  (12)|
|*  1 |  HASH JOIN           |              |    94 |  6110 |    17  (12)|
|   2 |   TABLE ACCESS FULL  | SMALL_TABLE  |  1879 | 48854 |    14   (8)|
|   3 |   TABLE ACCESS FULL  | BIG_TABLE    |    82 |  3198 |     3  (34)|
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access(A.SITE_ID=B.SITE_ID)
       filter(A.CATEGORY>B.FROM_CAT)

15 rows selected.

[/PHP]

[ 本帖最后由 eagle_fan 于 2008-3-20 00:13 编辑 ]

使用道具 举报

回复
论坛徽章:
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
69#
 楼主| 发表于 2008-3-20 00:02 | 只看该作者
原帖由 rollingpig 于 2008-3-19 14:40 发表
实际上还有一个很明显的指标,就是CPU Time 与 buffer_gets 的比值明显高于普通的select操作。证明有异常的计算正在进行。


对于buffer_gets会高我持怀疑态度,因为这些动作发生在PGA里面,不一定会体现在buffer gets上

实际的sql中还有full(a) parallel(a,4) hint,如果你看v$session_wait,slave 进程的等待事件都是"PX Deq Credit: send blkd"

这些都是迷惑人的地方

使用道具 举报

回复
论坛徽章:
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
70#
发表于 2008-3-20 08:42 | 只看该作者
正好相反,我说的是buffer_gets低,而CPU Time高(相对来说)

使用道具 举报

回复

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

本版积分规则 发表回复

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