|
|
其实想到问题可能出在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 编辑 ] |
|