mysql minus 语句用法_MySQL中对于notin和minus使用的优化

优化前:

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>@plan

PLAN_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 – 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 – filter(“T”.”status”=1)

4 – 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 processed

21 rows selected.

优化后:

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, 153, 154))

17:23:33 laojiu>@plan

PLAN_TABLE_OUTPUT

————————————————————————————————————————-

Plan hash value: 631655686

————————————————————————————————–

| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |

————————————————————————————————–

| 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 |

————————————————————————————————–

Predicate Information (identified by operation id):

—————————————————

5 – filter(“T”.”status”=1)

7 – 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;

改写后的sql由于逻辑读得到了天翻地覆的改变,很快得到结果。

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

如果exp的结果是false或者是unknown,那么lnnvl返回true;

如果exp的结果是true,返回false.

您可能感兴趣的文章:将MySQL的临时目录建立在内存中的教程

php简单操作mysql数据库的类

PHP使用mysqldump命令导出数据库

引用:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... 。 引: check the manual that corresponds to your MySQL server version for the right syntax to use near ‘(0) NOT NULL, endTime datetime(0) NOT NULL,avaliableTime int(8) NOT N’ at line 5 今天帮一个朋友调试...。 引用: 错误信息为: check the manual that corresponds to your MySQL server version for the right syntax 这是之前写的一条 Mysql语句报的 SQL错误,但是仔细检查 SQL语句没有发现有什么异常问题。后来百度查到,我的数据库表有一个字段名为 desc,这和 SQL语句的关键字冲突了,导致出现了这个问题。解决方法有两个:1.在数据库表冲突字段前后加 `符号(Tab键上面那个键),就不会再报语法错误了;2.修改数据库表冲突字段名称,修改为和 SQL语句关键字不冲突的其他名称。 麦田怪圈是指在麦田或其它田地上,通过某种未知力量(大多数怪圈是人类所为)把农作物压平而产生出来的几何图案。麦田怪圈的形成有三个说法,人为说、自然说与磁场说。人为说一般认为,麦田圈是用木板压成的。木板两头系上绳子形成圈套,在制作时,一脚踩在木板上拖动木板压倒麦子,并拉着细绳与圆心保持固定的距离,逐渐就可以形成一个圆圈。自然形成说认为麦田怪圈的成因还未被人类发现。就像雷电,古时候人类以为是雷神电母做的,对于麦田圈经常出现人文信息的现象,他们认为这只是人们“先入为主”造成的错觉。磁场说认为,磁场有一种神奇的移动力,可产生一股电流,使农作物“平躺”在地面上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值