雪凤凰_cu 发表于 2011-12-22 08:54

深入解析Oracle的三种join方法

<span class="Apple-style-span" style="font-family: song, Verdana; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "><div class="t_msgfont" id="postmessage_272916" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">NESTED LOOP:<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表(CBO 默认外表是<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">驱动表),而且在内表的连接字段上一定要有索引。当然也可以用ORDERED 提示来改变CBO<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">默认的驱动表,使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">HASH JOIN :<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">的行。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">提高I/O 的性能。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。如果使用散<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">列连接HASH_AREA_SIZE 初始化参数必须足够的大,如果是9i,Oracle建议使用<a href="http://space.itpub.net/22664653/viewspace-678383" target="_self" style="word-break: break-all; text-decoration: underline; color: rgb(51, 51, 51); line-height: normal !important; " target="_blank"><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">SQL</strong></u></a>工作区<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">自动<a href="http://space.itpub.net/22664653/viewspace-678383" target="_self" style="word-break: break-all; text-decoration: underline; color: rgb(51, 51, 51); line-height: normal !important; " target="_blank"><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">管理</strong></u></a>,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET 即可。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">排序合并连接<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。可以使用<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">USE_MERGE(table_name1 table_name2)来强制使用排序合并连接</div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">&nbsp;</div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "></div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "></div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">&nbsp;</div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "><font face="Verdana" style="word-break: break-all; line-height: normal !important; ">Nested loop join:<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">步骤:确定一个驱动表(outer table),另一个表为inner table,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小(&lt;10000)而且inner表需要有有效的访问方法(Index)。需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">cost = outer access cost + (inner access cost * outer cardinality)<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 2 | NESTED LOOPS | | 3 | 141 | 7 (15)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 3 | TABLE ACCESS FULL | EMPLOYEES | 3 | 60 | 4 (25)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 4 | TABLE ACCESS BY INDEX ROWID| JOBS | 19 | 513 | 2 (50)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 5 | INDEX UNIQUE SCAN | JOB_ID_PK | 1 | | |<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">EMPLOYEES为outer table, JOBS为inner table.<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">Hash join<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">步骤:将两个表中较小的一个在内存中构造一个HASH表(对JOIN KEY),扫描另一个表,同样对JOIN KEY进行HASH后探测是否可以JOIN。适用于记录集比较大的情况。需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个写的代价,会降低效率。<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">cost = (outer access cost * # of hash partitions) + inner access cost<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">--------------------------------------------------------------------------<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">--------------------------------------------------------------------------<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 0 | SELECT STATEMENT | | 665 | 13300 | 8 (25)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 1 | HASH JOIN | | 665 | 13300 | 8 (25)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 2 | TABLE ACCESS FULL | ORDERS | 105 | 840 | 4 (25)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">| 3 | TABLE ACCESS FULL | ORDER_ITEMS | 665 | 7980 | 4 (25)|<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">--------------------------------------------------------------------------<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">ORDERS为HASH TABLE,ORDER_ITEMS扫描<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">Sort merge join<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">步骤:将两个表排序,然后将两个表合并。通常情况下,只有在以下情况发生时,才会使用此种JOIN方式:<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">1.RBO模式<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">2.不等价关联(&gt;,&lt;,&gt;=,&lt;=,&lt;&gt;)<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">3.HASH_JOIN_ENABLED=false<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">4.数据源已排序<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; "><br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">cost = (outer access cost * # of hash partitions) + inner access cost</font></div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "><font face="Verdana" style="word-break: break-all; line-height: normal !important; "></font>&nbsp;</div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "></div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "></div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "><font face="Verdana" style="word-break: break-all; line-height: normal !important; "></font>&nbsp;</div><div class="t_msgfont" style="word-break: break-all; line-height: 1.8em !important; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">转载biti的一段话: &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 举例,表连接返回一条记录 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 存在两个表,一个 &nbsp; 10条记录 &nbsp; ,一个1000万条记录 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 若2表都存在连接字段索引,若以小表为驱动表,则 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 代价: &nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 10* &nbsp; (通过索引在大表查询一条记录的代价) &nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 若以大表为驱动表: &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 1000万 &nbsp; * &nbsp; (通过索引在小表中查询一条记录的代价) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 通过索引获取一条记录,10rows的表,代价通常在 &nbsp; 3 &nbsp; blocks &nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 索引2块,表一块 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 而如果是1000万的表,索引可能达到4块表一块 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 这样一来参考上面的计算,你说哪个更好?很显然! &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 小表查询参考 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SQL&gt; &nbsp; create &nbsp; table &nbsp; test &nbsp; as &nbsp; select &nbsp; * &nbsp; from &nbsp; all_objects &nbsp; where &nbsp; rownum &nbsp; &lt; &nbsp; 11; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Table &nbsp; created. &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SQL&gt; &nbsp; create &nbsp; index &nbsp; test_index &nbsp; on &nbsp; test(object_id); &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Index &nbsp; created. &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SQL&gt; &nbsp; select &nbsp; object_id &nbsp; from &nbsp; test; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; OBJECT_ID &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ---------- &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 18159 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 7781 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 4841 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 19891 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 22549 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 17099 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 17712 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 4287 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 10107 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 19135 &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 10 &nbsp; rows &nbsp; selected. &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Execution &nbsp; Plan &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ---------------------------------------------------------- &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; SELECT &nbsp; STATEMENT &nbsp; ptimizer=CHOOSE &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 1 &nbsp; 0 &nbsp; TABLE &nbsp; ACCESS &nbsp; (FULL) &nbsp; OF &nbsp; 'TEST' &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Statistics &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ---------------------------------------------------------- &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; recursive &nbsp; calls &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 12 &nbsp; db &nbsp; block &nbsp; gets &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 6 &nbsp; consistent &nbsp; gets &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; physical &nbsp; reads &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; redo &nbsp; size &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 736 &nbsp; bytes &nbsp; sent &nbsp; via &nbsp; SQL*Net &nbsp; to &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 425 &nbsp; bytes &nbsp; received &nbsp; via &nbsp; SQL*Net &nbsp; from &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 2 &nbsp; SQL*Net &nbsp; roundtrips &nbsp; to/from &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; sorts &nbsp; (memory) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; sorts &nbsp; (disk) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 10 &nbsp; rows &nbsp; processed &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SQL&gt; &nbsp; select &nbsp; * &nbsp; from &nbsp; test &nbsp; where &nbsp; object_id &nbsp; = &nbsp; 4287; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; OWNER &nbsp; OBJECT_NAME &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ------------------------------ &nbsp; ------------------------------ &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SUBOBJECT_NAME &nbsp; OBJECT_ID &nbsp; DATA_OBJECT_ID &nbsp; OBJECT_TYPE &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ------------------------------ &nbsp; ---------- &nbsp; -------------- &nbsp; ------------------ &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; CREATED &nbsp; LAST_DDL_ &nbsp; TIMESTAMP &nbsp; STATUS &nbsp; T &nbsp; G &nbsp; S &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; --------- &nbsp; --------- &nbsp; ------------------- &nbsp; ------- &nbsp; - &nbsp; - &nbsp; - &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; SYS &nbsp; /1033c8a_SqlTypeWithMethods &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 4287 &nbsp; JAVA &nbsp; CLASS &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 14-NOV-00 &nbsp; 03-JUL-03 &nbsp; 2003-07-03:11:18:19 &nbsp; INVALID &nbsp; N &nbsp; N &nbsp; N &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Execution &nbsp; Plan &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ---------------------------------------------------------- &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; SELECT &nbsp; STATEMENT &nbsp; ptimizer=CHOOSE &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 1 &nbsp; 0 &nbsp; TABLE &nbsp; ACCESS &nbsp; (BY &nbsp; INDEX &nbsp; ROWID) &nbsp; OF &nbsp; 'TEST' &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 2 &nbsp; 1 &nbsp; INDEX &nbsp; (RANGE &nbsp; SCAN) &nbsp; OF &nbsp; 'TEST_INDEX' &nbsp; (NON-UNIQUE) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; Statistics &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; ---------------------------------------------------------- &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; recursive &nbsp; calls &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; db &nbsp; block &nbsp; gets &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 3 &nbsp; consistent &nbsp; gets &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; physical &nbsp; reads &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; redo &nbsp; size &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 1157 &nbsp; bytes &nbsp; sent &nbsp; via &nbsp; SQL*Net &nbsp; to &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 425 &nbsp; bytes &nbsp; received &nbsp; via &nbsp; SQL*Net &nbsp; from &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 2 &nbsp; SQL*Net &nbsp; roundtrips &nbsp; to/from &nbsp; client &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; sorts &nbsp; (memory) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 0 &nbsp; sorts &nbsp; (disk) &nbsp;&nbsp;<br style="word-break: break-all; line-height: normal !important; font: normal normal normal 12px/normal song, Verdana; ">&nbsp; 1 &nbsp; rows &nbsp; processed &nbsp;&nbsp;</div></span>

yeeek 发表于 2011-12-22 09:15

这个字体很特别啊
页: [1]
查看完整版本: 深入解析Oracle的三种join方法