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

目录
相关文章
|
4月前
|
机器学习/深度学习 索引 Python
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
本文解释了NumPy中`argmax`函数的`axis`参数在不同维度数组中的应用,并通过代码示例展示了如何使用`axis=0`、`axis=1`和`axis=-1`来找到数组中最大值的索引。
305 0
Numpy学习笔记(二):argmax参数中axis=0,axis=1,axis=-1详解附代码
codeforces 347A - Difference Row
给你一个序列,让你求(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).值最大的一个序列,我们化简一下公式就会发现(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn). = x1 - xn, 也就是说只有第一个和最后一个是确定的,其他的随便了! 也不是了, 还要让你按字典序最小的排列,也就是说其他的是按飞递减序排列的,简单的一次排序就OK了。
37 0
vmin 和 vmax的区别
vmin是当前 vw 和 vh 中较小的一个值,vmax是当前 vw 和 vh 中较大的一个值。
259 0
|
网络架构
Codeforces Round #755 D. Guess the Permutation(交互 二分)
Codeforces Round #755 D. Guess the Permutation(交互 二分)
99 0
|
机器学习/深度学习 Java
Codeforces Round #748 (Div. 3) D2. Half of Same(数学 枚举 思维)
Codeforces Round #748 (Div. 3) D2. Half of Same(数学 枚举 思维)
112 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
853 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?