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