《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使用的优化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)