记一次not in 和 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.

目录
相关文章
|
1月前
|
Java C++ Python
不同语言实现 (5).add(3).minus(2) 功能
本文介绍了如何在Python、Java和C++中实现`(5).add(3).minus(2)`功能。各语言通过定义一个类来包装数字,并提供`add`和`minus`方法支持链式调用,尽管具体语法和实现细节有所差异,但核心思路一致。
|
1月前
|
JavaScript 前端开发
实现 (5).add(3).minus(2) 功能
通过JavaScript实现类似`(5).add(3).minus(2)`的功能,定义了`NumberWrapper`类,包含`add`和`minus`方法,用于数值的增减操作并支持链式调用。示例代码展示了从5开始,先加3再减2的过程。
BigDecimal 舍入模式(Rounding mode)中的ROUND_UNNECESSARY
BigDecimal 舍入模式(Rounding mode)中的ROUND_UNNECESSARY
187 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
769 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
|
编解码 前端开发 iOS开发
CSS 数学函数之calc、clamp、min、max
回想过去,CSS 需要兼容各种版本的浏览器,那种在效果和可用之间痛苦选择的经历记忆犹新。现在的 CSS 能够做很多事情,而对于浏览器的兼容性只需考虑主流的,并且大部分主流的浏览器都支持最新 CSS 特性。本文来总结一下CSS中数学函数之min、max、calc、clamp。
331 0
零元学Expression Blend 4 Chapter 22 以实作案例学习Frame及HyperlinkButton
原文:零元学Expression Blend 4 Chapter 22 以实作案例学习Frame及HyperlinkButton 本章将教大家如何以实作善用Blend4的内建功能-「Frame」以及「Hy...
1342 0