ORACLE:EXISTS优化

原sql:

SELECT a.id,
       a.orderid,
       a.keyword,
       a.begindate,
       a.enddate,
       a.providerid
  FROM searchengine_keyword a
 WHERE EXISTS
          (SELECT *
             FROM (  SELECT b.keyword, COUNT (*)
                       FROM searchengine_keyword b
                      WHERE b.keyword IN (SELECT c.keyword
                                            FROM searchengine_keyword c
                                           WHERE     c.providerid = :1
                                                 AND c.state = '0'
                                                 AND c.TYPE = '1'
                                                 AND c.begindate IS NOT NULL
                                                 AND c.enddate IS NOT NULL
                                                 AND c.begindate < SYSDATE
                                                 AND c.keyword IS NOT NULL)
                   GROUP BY b.keyword
                     HAVING COUNT (*) < 2 AND COUNT (*) > 0) x
            WHERE x.keyword = a.keyword)
Plan hash value: 1334176065
-----------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                               |       |       |  2488M(100)|          |
|*  1 |  FILTER                         |                               |       |       |            |          |
|   2 |   TABLE ACCESS FULL             | SEARCHENGINE_KEYWORD          |   561K|    23M|  4633   (1)| 00:00:56 |
|*  3 |   FILTER                        |                               |       |       |            |          |
|   4 |    SORT GROUP BY NOSORT         |                               |     1 |    46 |  4635   (1)| 00:00:56 |
|*  5 |     HASH JOIN SEMI              |                               |     1 |    46 |  4635   (1)| 00:00:56 |
|*  6 |      TABLE ACCESS FULL          | SEARCHENGINE_KEYWORD          |     5 |    45 |  4630   (1)| 00:00:56 |
|*  7 |      TABLE ACCESS BY INDEX ROWID| SEARCHENGINE_KEYWORD          |     1 |    37 |     5   (0)| 00:00:01 |
|*  8 |       INDEX RANGE SCAN          | I_SEARCHENGINE_KEYWORD_PROVID |     2 |       |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------
Peeked Binds (identified by position):
--------------------------------------
   1 - :1 (NUMBER): 100015402133
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter( IS NOT NULL)
   3 - filter((COUNT(*)<2 AND COUNT(*)>0))
   5 - access("B"."KEYWORD"="C"."KEYWORD")
   6 - filter("B"."KEYWORD"=:B1)
   7 - filter(("C"."KEYWORD"=:B1 AND "C"."TYPE"=1 AND "C"."STATE"=0 AND "C"."ENDDATE" IS NOT NULL AND
              "C"."BEGINDATE"<SYSDATE@! AND "C"."KEYWORD" IS NOT NULL))
   8 - access("C"."PROVIDERID"=:1)

10分钟不出结果,进程大量积压,cpu100%

改写如下:

explain plan for SELECT a.id,
  2         a.orderid,
  3         a.keyword,
  4         a.begindate,
  5         a.enddate,
  6         a.providerid
  7    FROM searchengine_keyword a
  8   WHERE a.keyword in
  9            (SELECT x.keyword
 10               FROM (  SELECT b.keyword, COUNT (*)
 11                         FROM searchengine_keyword b
 12                        WHERE b.keyword IN (SELECT c.keyword
 13                                              FROM searchengine_keyword c
 14                                             WHERE     c.providerid = 100015402133
 15                                                   AND c.state = '0'
 16                                                   AND c.TYPE = '1'
 17                                                   AND c.begindate IS NOT NULL
 18                                                   AND c.enddate IS NOT NULL
 19                                                   AND c.begindate < SYSDATE
 20                                                   AND c.keyword IS NOT NULL)
                   GROUP BY b.keyword
                     HAVING COUNT (*) < 2 AND COUNT (*) > 0) x
 23           );
Explained.

select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4028499329
------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                               |     1 |   101 |  9270   (1)| 00:01:52 |
|*  1 |  FILTER                          |                               |       |       |            |          |
|   2 |   HASH GROUP BY                  |                               |     1 |   101 |  9270   (1)| 00:01:52 |
|*  3 |    HASH JOIN                     |                               |     1 |   101 |  9269   (1)| 00:01:52 |
|   4 |     MERGE JOIN CARTESIAN         |                               |  9768 |   877K|  4638   (1)| 00:00:56 |
|   5 |      SORT UNIQUE                 |                               |     1 |    37 |     5   (0)| 00:00:01 |
|*  6 |       TABLE ACCESS BY INDEX ROWID| SEARCHENGINE_KEYWORD          |     1 |    37 |     5   (0)| 00:00:01 |
|*  7 |        INDEX RANGE SCAN          | I_SEARCHENGINE_KEYWORD_PROVID |     2 |       |     3   (0)| 00:00:01 |
|   8 |      BUFFER SORT                 |                               |   561K|    29M|  4633   (1)| 00:00:56 |
|   9 |       TABLE ACCESS FULL          | SEARCHENGINE_KEYWORD          |   561K|    29M|  4632   (1)| 00:00:56 |
|  10 |     TABLE ACCESS FULL            | SEARCHENGINE_KEYWORD          |   561K|  4935K|  4629   (1)| 00:00:56 |
------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(COUNT(*)<2 AND COUNT(*)>0)
   3 - access("A"."KEYWORD"="B"."KEYWORD" AND "B"."KEYWORD"="C"."KEYWORD")
   6 - filter("C"."TYPE"=1 AND "C"."STATE"=0 AND "C"."ENDDATE" IS NOT NULL AND "C"."BEGINDATE"<SYSDATE@!
              AND "C"."KEYWORD" IS NOT NULL)
   7 - access("C"."PROVIDERID"=100015402133)
26 rows selected.

秒杀





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值