oracle开发系列(三)existsnot exists用法(10g)

从上面执行计划可以看到 cost 差别很大 ,not exists 比not in 的小很多。 not exists使用的是hash join anti 而 not in 使用的是filter。执行时间来看 not exists 几分钟 not in 执行了30分钟还没完成。小总结:(此内容转)Semi-join通常出现在使用了exists或in的sql中,所谓semi-join即在两表关联时,当第二个表中存在一个或多个匹配记录时,返回第一个表的记录;与普通join的区别在于semi-join时,第一个表里的记录最多只返回一次Anti-join 第二张表没有发现匹配记录时,才会返回第一张表里的记录;何时选择anti-join1 使用not in且相应列有not null约束not exists,不保证每次都用到anti-join当无法选择anti-join时,oracle常会采用filter替代filter是对外表的每一行,都要对内表执行一次全表扫描,他其实很像我们熟悉的neested loop,,但它的独特之处在于会维护一个hash table三 两个表根据某字段关联更新update ap set ap.t =(select bp.t from bp where ap.s = bp.s) where exists (select 1 from bp where ap.s = bp.s);commit;

语句看似很简单 但是当ap bp本身都是很复杂的查询的时候 可能想到这个比较困难了。

一切伟大的行动和思想,都有一个微不足道的开始

oracle开发系列(三)existsnot exists用法(10g)

相关文章:

你感兴趣的文章:

标签云: