遇到比较奇怪的一个问题,hash join的时候 大表做驱动表比小表做驱动表 consistent gets 小,而且快
test.sql:
select value from v$mystat where statistic#=12;
select * from sh.sales s,sh.customers c where s.cust_id=c.cust_id;
select value from v$mystat where statistic#=12;
test2.sql
select value from v$mystat where statistic#=12;
select/*+ordered*/ * from sh.sales s,sh.customers c where s.cust_id=c.cust_id;
select value from v$mystat where statistic#=12;
对比
value 是从v$mystat 中获得的cpu 使用情况
0redo size
48408961bytes sent via SQL*Net to client
674236bytes received via SQL*Net from client
61258SQL*Net roundtrips to/from client
0sorts (memory)
0sorts (disk)
918843rows processed
VALUE
----------
1487
Elapsed: 00:00:00.00
LIZH@ORCL>
数据库版本9,10,11都差不多,sales 不是分区表也差不多 (没有测试大表很大,以至于需要分区构建hash表的情况)
这个测试中还有问题
163271404bytes sent via SQL*Net to client
48408961bytes sent via SQL*Net to client
不知道为什么返回数据量区别这么大
按说小表作为驱动表应该好,可是从这个测试中没看出来好处啊
[ 本帖最后由 gclizh 于 2008-7-24 14:01 编辑 ]
我测试了一下。我得到结果没有这么大的区别。而且几乎是一致的。我这个测试表数据量不大。大表下面是我的测试结果。
环境:windows oracle 10.2.0.1
SQL> select count(*) from test1;
COUNT(*)
----------
49751
SQL> select count(*) from test2;
COUNT(*)
----------
2000
SQL> alter system flush shared_pool;
系统已更改。
SQL> select /*+ leading(a) use_hash(a,b) */ * from test1 a,test2 b where a.object_id=b.object_id;
已选择2000行。
0redo size
166009bytes sent via SQL*Net to client
1848bytes received via SQL*Net from client
135SQL*Net roundtrips to/from client
14sorts (memory)
0sorts (disk)
2000rows processed
SQL> alter system flush shared_pool;
系统已更改。
SQL> select /*+ leading(b) use_hash(a,b) */ * from test1 a,test2 b where a.object_id=b.object_id;
已选择2000行。
to foxmile分析不分析只影响 执行计划,现在是我指定了执行 ,跟标分析不分析应该没有关系
to lhlzjxcustomers sales应该是很典型的主子表情况 一对多的关系
SQL> select *
2from (select count(*), cust_id from sales group by cust_id order by 1 desc)
3 where rownum <= 10
4;