本篇内容介绍了“数据库中外连接有OR关联条件只能走NL优化的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!测试数据外连接有OR关联条件只能走NL,若驱动表的结果集较大,则会产生大量的关联,会产生性能问题,需要进行优化。在两个表做外连接时存在几种情况:1、在进行外连接时,使用nl,此时主表被固定成驱动表,无法通过hint进行驱动表的调整2、在进行外连接时,使用hash,可以通过hint调整驱动表和被驱动表针对外连接的情况做以下的实验:
1、当执行计划是nl,t1是驱动表(主表),t2是被驱动表,调整t2为驱动表,t1为被驱动表。2、当执行计划是nl,t1是驱动表(主表),t2是被驱动表,调整执行计划为hash。3、当执行计划是hash,t1是驱动表(主表),t2是被驱动表,调整t2为驱动表,t1为被驱动表。4、当执行计划是hash,t1是驱动表(主表),t2是被驱动表,调整执行计划为nl。5、当外连接有OR关联条件(T1.ID = T2.ID OR T1.AGE = T2.ID),进行等价改写执行计划是nl的情况有如下SQL:通过执行计划可以看到,走了nl,并且t1是驱动表。1、当执行计划是nl,t1是驱动表(主表),t2是被驱动表,调整t2为驱动表,t1为被驱动表。在内连接中,可以实现驱动表和被驱动表的调整,但是在外连接中不能调整驱动表的顺序通过执行计划可以看到,驱动表还是t1,并没有改变执行顺序,因此在执行计划是nl的外连接中无法进行驱动表和被驱动表的调整。不能调整的原因:在进行外连接时,t1作为主表,左外连接t2,因此需要返回t1的全部数据。嵌套循环需要传值,主表传值给从表之后,如果发现从表没有关联上,直接显示为 NULL 即可;但是如果是从表传值给主表,没关联上的数据不能传值给主表,不可能传 NULL 给主表,所以两表关联是外连接的时候,走嵌套循环驱动表只能固定为主表。2、当执行计划是nl,t1是驱动表(主表),t2是被驱动表,调整执行计划为hash。想办法调整为hash使用hint:use_hash()驱动表:t1被驱动表:t2此时的hint未生效,走了最初的nl连接。尝试使用其他hint此时的hint未生效,走了最初的nl连接。原因和走nl,不能调整驱动表和被驱动表的原理一致,只可以改变表的连接方式,但是不能改变表的访问顺序。3、当执行计划是hash,t1是驱动表(主表),t2是被驱动表,调整t2为驱动表,t1为被驱动表。想办法调整表的访问顺序使用hint:use_hash()驱动表:t2被驱动表:t1通过执行计划可以看到,驱动表还是t1,并没有改变执行顺序。通过执行计划可以看到,此时驱动表已经变成了t2,被驱动表变成了t1,同时可以看到id=2的操作,从原来的HASH JOIN OUTER 变成了HASH JOIN RIGHT OUTER,这部分是等价的,相当于t1左外连接t2改写为t2右外连接t1。此时hint为生效,还是原来的执行计划。4、当执行计划是hash,t1是驱动表(主表),t2是被驱动表,调整执行计划为nl。把hash调整为nl驱动表:t1被驱动表:t2执行计划中已经从hash变为nl,并且t1是驱动表,t2是被驱动表把hash调整为nl驱动表:t2被驱动表:t1通过执行计划可以看到,驱动表还是t1,并没有改变执行顺序。
原因和走nl,不能调整驱动表和被驱动表的原理一致,只可以改变表的连接方式,但是不能改变表的访问顺序。5、当外连接有OR关联条件,进行等价改写(2)T1作为主表和T2做外连接,需要返回T1的全部数据以及满足条件的T2记录,还有不满足条件的T2的结果null。当使用了OR,则表示只要满足其中的一个条件即可返回T1和T2的记录。这时候的执行计划肯免费主机域名定是有问题的:1、被驱动表是全表扫描,连接列没有索引,t1传出一条数据,t2就需要全表扫描一次。2、一般来说,走nl是小表在前,大表在后,但是在外连接中,走了nl,或者确定了主表,那么他就一定是驱动表,这里的主表可以是一个表,也可以是一个过滤完的结果集,因此当主表的结果集很大的时候,驱动表就需要被驱动很多次,做了大量的join操作,耗费很多的资源。几种情况:t1是小表,t2是大表,但是t2列没有索引,都是全表扫描;t1是小表,t2是小表,但是t2列没有索引,都是全表扫描;t1是大表,t2是大表,但是t2列没有索引,都是全表扫描;t1是大表,t2是小表,但是t2列没有索引,都是全表扫描;以上的操作都是有问题,走的是nl,但是被驱动表都是全表扫描。还有其他情况,t2表的连接列有索引t1是小表,t2是大表,但是t2列有索引;t1是小表,t2是小表,但是t2列有索引;t1是大表,t2是大表,但是t2列有索引;t1是大表,t2是小表,但是t2列有索引;以上的操作相比较全表扫描而言性能有所提高,但是也是存在大量的join。当t2的id列有索引时因为连接条件都是对t2的id进行关联,在t2的连接条件上有索引时,会使用索引,但是会进行两次索引扫描,然后回表,然后把这个结果集作为一个视图。t1给一条记录,则扫描免费主机域名一次视图,这样也是有问题的。使用上述操作时存在以下问题:1、访问方式被固定,只能使用nl,不管被驱动表的连接列是否有索引2、当驱动表很大,被驱动表很小,使用nl的效率很低,被驱动表需要访问t1的行记录数(结果集)优化思路:1、调整驱动表和被驱动表的顺序2、使用hash1、调整驱动表和被驱动表的顺序原因:nl的外连接无法更改驱动表被驱动表。2、使用hash加hash的hint无法把执行计划调整为hash。最终思路:需要进行等价改写,使得这样的查询执行计划不走nl,或者可以更改驱动表(不可能,前面提过,nl的外连接无法更改驱动表)。因此只虑等价改写,用来消除or的影响。在进行等价改写时,又分为两种情况:1、t2的id字段没有重复值2、t2的id字段有重复值当t2的id字段没有重复值,进行等价改写(感谢郭老师):通过执行计划可以看到,不走nl,都走了hash,并且通过Starts列可以看到,对每个表的访问次数都是1,达到了通过改写SQL把nl调整为hash的效果。最终的优化效果,逻辑读由49降到了22。当t2的id字段有重复值,进行等价改写:
通过执行计划可以看到,不走nl,都走了hash,并且通过Starts列可以看到,对每个表的访问次数都是1,达到了通过改写SQL把nl调整为hash的效果。最终的优化效果,逻辑读由49降到了21。
“数据库中外连接有OR关联条件只能走NL优化的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!
相关推荐: 在SQL PLUS中格式化输出查询结果的方法是什么
这篇文章主要讲解了“在S免费主机域名QL PLUS中格式化输出查询结果的方法是什么”免费主机域名,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在SQL PLUS中格式化输出查询结果的方法是什么”吧!一:过程代码二…