Mysql入门MySQL中对于not in和minus使用的优化

Mysql入门MySQL中对于not in和minus使用的优化,第1张

概述介绍《Mysql入门MySQL中对于not in和minus使用的优化》开发教程,希望对您有用。

《MysqL入门MysqL中对于not in和minus使用的优化》要点:
本文介绍了MysqL入门MysqL中对于not in和minus使用的优化,希望对您有用。如果有疑问,可以联系我们。

优化前:
MysqL数据库

select count(t.ID) from test t where t.status = 1  and t.ID not in (select distinct a.app_ID           from test2 a           where a.type = 1            and a.rule_ID in (152,153,154))       17:20:57 laojiu>@planPLAN_table_OUTPUT――――――――――――――――――――――――――――――――――――――――-Plan hash value: 684502086―――――――――――――――――――――――――――――-| ID | Operation      | name       | Rows | Bytes | Cost (%cpu)| Time   |―――――――――――――――――――――――――――――-|  0 | SELECT STATEMENT  |         |   1 |  18 |  176K (2)| 00:35:23 ||  1 | SORT AGGREGATE   |         |   1 |  18 |      |     ||* 2 |  FILTER      |         |    |    |      |     ||* 3 |  table ACCESS FulL| test   | 1141 | 20538 |  845  (2)| 00:00:11 ||* 4 |  table ACCESS FulL| test2 |   1 |  12 |  309  (2)| 00:00:04 |―――――――――――――――――――――――――――――-Predicate information (IDentifIEd by operation ID):―――――――――――――――――  2 C filter( NOT EXISTS (SELECT /*+ */ 0 FROM “test2″ “A” WHERE       “A”.”type”=1 AND (“A”.”RulE_ID”=152 OR “A”.”RulE_ID”=153 OR       “A”.”RulE_ID”=154) AND LNNVL(“A”.”APP_ID”<>:B1)))  3 C filter(“T”.”status”=1)  4 C filter(“A”.”type”=1 AND (“A”.”RulE_ID”=152 OR “A”.”RulE_ID”=153 OR       “A”.”RulE_ID”=154) AND LNNVL(“A”.”APP_ID”<>:B1))Statistics―――――――――――――――――――-     0 recursive calls     0 db block gets  1762169 consistent gets     0 physical reads     0 redo size    519 bytes sent via sql*Net to clIEnt    492 bytes received via sql*Net from clIEnt     2 sql*Net roundtrips to/from clIEnt     0 sorts (memory)     0 sorts (disk)     1 rows processed21 rows selected.

优化后:
MysqL数据库

 select count(*) from( select t.ID  from test t where t.status = 1 minus select distinct a.app_ID  from test2 a where a.type = 1  and a.rule_ID in (152,154))17:23:33 laojiu>@planPLAN_table_OUTPUT――――――――――――――――――――――――――――――――――――――――-Plan hash value: 631655686――――――――――――――――――――――――――――――――C| ID | Operation       | name       | Rows | Bytes |TempSpc| Cost (%cpu)| Time   |――――――――――――――――――――――――――――――――C|  0 | SELECT STATEMENT   |         |   1 |    |    | 1501  (2)| 00:00:19 ||  1 | SORT AGGREGATE    |         |   1 |    |    |      |     ||  2 |  VIEW        |         | 1141 |    |    | 1501  (2)| 00:00:19 ||  3 |  MINUS       |         |    |    |    |      |     ||  4 |   SORT UNIQUE    |         | 1141 | 20538 |    |  846  (2)| 00:00:11 ||* 5 |   table ACCESS FulL| test   | 1141 | 20538 |    |  845  (2)| 00:00:11 ||  6 |   SORT UNIQUE    |         | 69527 |  814K| 3632K|  654  (2)| 00:00:08 ||* 7 |   table ACCESS FulL| test2 | 84140 |  986K|    |  308  (2)| 00:00:04 |――――――――――――――――――――――――――――――――CPredicate information (IDentifIEd by operation ID):―――――――――――――――――  5 C filter(“T”.”status”=1)  7 C filter(“A”.”type”=1 AND (“A”.”RulE_ID”=152 OR “A”.”RulE_ID”=153 OR       “A”.”RulE_ID”=154))21 rows selected.Statistics―――――――――――――――――――-     1 recursive calls     0 db block gets    2240 consistent gets     0 physical reads     0 redo size    516 bytes sent via sql*Net to clIEnt    492 bytes received via sql*Net from clIEnt     2 sql*Net roundtrips to/from clIEnt     2 sorts (memory)     0 sorts (disk)     1 rows processed

在优化sql的时候,我们需要转变一下思路,等价的改写sql;MysqL数据库

改写后的sql由于逻辑读得到了天翻地覆的改变,很快得到结果.MysqL数据库

第一条sql执行计划中有一个函数,LNNVL(“A”.”APP_ID”<>:B1),lnnvl(exp)MysqL数据库

如果exp的结果是false或者是unkNown,那么lnnvl返回true;MysqL数据库

如果exp的结果是true,返回false.
MysqL数据库

总结

以上是内存溢出为你收集整理的Mysql入门MySQL中对于not in和minus使用的优化全部内容,希望文章能够帮你解决Mysql入门MySQL中对于not in和minus使用的优化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1163328.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存