一个简易的inexists优化原则和不不存在

一个简易的inexists优化原则和不不存在
1。存在的执行流程
从存在的T1中选择*(从T2中选择NULL,在这里,y = x)
它可以理解为:
复制代码代码如下所示:
对于x在(选择*从T1)

如果(存在(选择空从T2在y = x.x)
然后
输出记录
最后如果
结束循环

存在与存在的性能差异:
如果子查询的子集导致更少的记录,则主查询中的表更大,索引更大。在应该使用。否则,如果外层的主要查询记录较少,子查询中的表是大的,并且在索引时存在。
事实上,我们区分和存在主要是由驱动程序的变化引起的(这是关键性的变化),如果它是存在的,那么在外部表驱动表,访问前,如果是,那么先执行子查询,所以我们要开车快速返回的目标,那么关系考虑的指标和结果集。
此外,在不处理null的情况下,例如:
选择1双,空(0,1,2,null)
结果是空的。

2。不在而且不存在:
不存在的执行流
复制代码代码如下所示:
选择…
从汇总R
在不存在(select'found'from标题T)
在r.source_id = t.title_id);

它可以理解为:
复制代码代码如下所示:
为x(SELECT * FROM汇总)

如果(不存在(那个查询))
输出
最后如果;
结束;

注:不存在,不在不能完全替代对方,以查看具体要求。如果选定的列可以是空的,它是不能取代的。
例如,下面的语句,它们之间的区别
从T中选择x,y;
X Y

十三
三十一
十二
十一
三十一

从T中选择x,不在(从T T2中选择y)
没有行
从T不存在的地方选择*(从T T2中选择NULL)
在T2 y = t.x)。
X Y

5空
所以具体的要求就决定了。
不存在与不存在的性能差异:
不是只有当查询字段,选择关键词后非空约束或不曾建议,如果在主查询的大桌子,在子查询,但记录的一张小桌子,你应该使用反不在,和哈希联接。
如果主查询表中的记录,表中查询记录,并且有一个指标,你可以使用不存在,不在,也可与最好的是空hash_aj * / / * +
不在更好的成本为基础的应用
例如:
复制代码代码如下所示:
选择…
从汇总R
在不存在(select'found'from标题T)
在r.source_id = t.title_id);

变为(好)
选择…
从标题、汇总R
在r.source_id = t.title_id(+)
和t.title_id是空的;
或(好)
SQL >选择hash_aj / * +…
从汇总R
在ource_id没有(选择ource_id)
从标题T
在ource_id不为空)
注:以上只是一些理论上的建议。最好的原则是,我们可以使用执行计划,分析最好的句子,在此基础上。
/ / =============================
存在,不存在摘要

1存在
SELECT * FROM anken_m存在(
选择my_list_temp_m.sales_code
从my_list_temp_m
在my_list_temp_m。sales_code = anken_m sales_code)。
解释uff1a
1)查询两anken_m表和my_list_temp_m表存在的sales_code。
2)sales_code是anken_m的关键,对my_list_temp_m外键。
小心 uff1a
1)外anken_m查询表是查询对象。
2)内查询表my_list_temp_m是一个有条件的对象。
3)内部和外部层的查询表不能相同。
4)的anken_m表,作为协会的条件,不需要内部查询后加入。
5)左、右的my_list_temp_m秩序。sales_code = anken_m.sales_code状况不影响查询结果。

2不存在
SELECT * FROM anken_m哪里不存在(
选择my_list_temp_m.sales_code
从my_list_temp_m
在my_list_temp_m。sales_code = anken_m sales_code)。
解释uff1a
1)查询中存在的anken_m表,但sales_code不在my_list_temp_m表存在。
2)sales_code是anken_m的关键,对my_list_temp_m外键。
小心 uff1a
1)外anken_m查询表是查询对象。
2)内查询表my_list_temp_m是一个有条件的对象。
3)内部和外部层的查询表不能相同。
4)的anken_m表,作为协会的条件,不需要内部查询后加入。
5)左、右的my_list_temp_m秩序。sales_code = anken_m.sales_code状况不影响查询结果。

3综合应用
更新anken_m
集(plan_type_code,branch_name,business_type_code)
=(选择anken.plan_type_code,anken.branch_name,安肯。business_type_code)
从安肯
在安肯。sales_code = anken_m sales_code)。
(存在的地方
选择anken.sales_code
从安肯,my_list_temp_m
在my_list_temp_m sales_code = anken.sales_code。
和sales_code = anken_m.sales_code安肯。

解释uff1a
1)用一张表的记录数据更新另一张表的记录数据。
2)用SQL语句进行批处理更新。
2)sales_code是安肯,anken_m的关键,和my_list_temp_m外键。
小心 uff1a
1)更新的字段集合中的语句必须对应于数据源的领域之一,并且在数据源的查询条件必须限制记录。也就是说,根据sales_code,一个记录和一个记录anken_m安肯可以唯一确定,以确保关键最新的记录和数据源的记录是一样的。
2)根据存在的说法,你可以确定数据源的记录,即范围,记录在安肯表可以用来更新anken_m表。所以anken_m不需要后,在那里存在的声明说。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部