這篇文章主要介紹了MySQL中對(duì)于not in和minus使用的優(yōu)化,作者給出了實(shí)例和運(yùn)行時(shí)間對(duì)比,需要的朋友可以參考下
優(yōu)化前:
- 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.
優(yōu)化后:
- 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
在優(yōu)化sql的時(shí)候,我們需要轉(zhuǎn)變一下思路,等價(jià)的改寫sql;
改寫后的sql由于邏輯讀得到了天翻地覆的改變,很快得到結(jié)果。
第一條sql執(zhí)行計(jì)劃中有一個(gè)函數(shù),LNNVL(“A”.”APP_ID”<>:B1),lnnvl(exp)
如果exp的結(jié)果是false或者是unknown,那么lnnvl返回true;
如果exp的結(jié)果是true,返回false.
新聞熱點(diǎn)
疑難解答
圖片精選