oracle数据库驱动表

出处:http://blog.itpub.net/71225/viewspace-828310/http://www.itpub.net/showthread.php?s=&threadid=144375&perpage=10&pagenumber=2

rule 下所谓驱动表还有 nested loops and hash join 之份我们以 nested loop 为例:

如果两个表连接字段都没有索引(通常这个时候是 sort merge / hash join),则驱动表会选择后者

若两个表其中有一个有索引而另外一个没有索引,则驱动表是没有索引那一个,跟顺序无关

若两个表都有索引,则驱动表为 后面 那一个表

所以事实上,RULE下,只有在两个表都存在连接字段的索引的情况下才需要考虑顺序问题

也就是小表放在后面大表放在前面(当然到底哪个好这实际上还跟 符合条件的记录数、数据分布等因素相关!!!,所以应该以实际测试为准)

关键的是明白执行计划而不在于记什么规则

举例,表连接返回一条记录存在两个表,一个 10条记录 ,一个1000万条记录若2表都存在连接字段索引,

若以小表为驱动表,则代价: 10* (通过索引在大表查询一条记录的代价) 

若以大表为驱动表:1000万 * (通过索引在小表中查询一条记录的代价)

通过索引获取一条记录,10rows的表,代价通常在 3 blocks 索引2块,表一块

而如果是1000万的表,索引可能达到4块表一块

这样一来参考上面的计算,你说哪个更好?很显然!

小表查询参考SQL> create table test as select * from all_objects where rownum < 11;Table created.SQL> create index test_index on test(object_id);Index created.SQL> select object_id from test;OBJECT_ID----------1815977814841198912254917099177124287101071913510 rows selected.Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 TABLE ACCESS (FULL) OF 'TEST'Statistics----------------------------------------------------------0 recursive calls12 db block gets6 consistent gets0 physical reads0 redo size736 bytes sent via SQL*Net to client425 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)10 rows processedSQL> select * from test where object_id = 4287;OWNER OBJECT_NAME------------------------------ ------------------------------SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE------------------------------ ---------- -------------- ------------------CREATED LAST_DDL_ TIMESTAMP STATUS T G S--------- --------- ------------------- ------- - - -SYS /1033c8a_SqlTypeWithMethods4287 JAVA CLASS14-NOV-00 03-JUL-03 2003-07-03:11:18:19 INVALID N N NExecution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST'2 1 INDEX (RANGE SCAN) OF 'TEST_INDEX' (NON-UNIQUE)Statistics----------------------------------------------------------0 recursive calls0 db block gets3 consistent gets0 physical reads0 redo size1157 bytes sent via SQL*Net to client425 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)1 rows processedSQL>如果是 CBO 下则跟顺序无关

猜你喜欢

转载自blog.csdn.net/fantasyagain/article/details/46361173