ORACLE:EXISTS优化

前端之家收集整理的这篇文章主要介绍了ORACLE:EXISTS优化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sql

  1. SELECT a.id,a.orderid,a.keyword,a.begindate,a.enddate,a.providerid
  2. FROM searchengine_keyword a
  3. WHERE EXISTS
  4. (SELECT *
  5. FROM ( SELECT b.keyword,COUNT (*)
  6. FROM searchengine_keyword b
  7. WHERE b.keyword IN (SELECT c.keyword
  8. FROM searchengine_keyword c
  9. WHERE c.providerid = :1
  10. AND c.state = '0'
  11. AND c.TYPE = '1'
  12. AND c.begindate IS NOT NULL
  13. AND c.enddate IS NOT NULL
  14. AND c.begindate < SYSDATE
  15. AND c.keyword IS NOT NULL)
  16. GROUP BY b.keyword
  17. HAVING COUNT (*) < 2 AND COUNT (*) > 0) x
  18. WHERE x.keyword = a.keyword)
  19. Plan hash value: 1334176065
  20. -----------------------------------------------------------------------------------------------------------------
  21. | Id | Operation | Name | Rows | Bytes | Cost (%cpu)| Time |
  22. -----------------------------------------------------------------------------------------------------------------
  23. | 0 | SELECT STATEMENT | | | | 2488M(100)| |
  24. |* 1 | FILTER | | | | | |
  25. | 2 | TABLE ACCESS FULL | SEARCHENGINE_KEYWORD | 561K| 23M| 4633 (1)| 00:00:56 |
  26. |* 3 | FILTER | | | | | |
  27. | 4 | SORT GROUP BY NOSORT | | 1 | 46 | 4635 (1)| 00:00:56 |
  28. |* 5 | HASH JOIN SEMI | | 1 | 46 | 4635 (1)| 00:00:56 |
  29. |* 6 | TABLE ACCESS FULL | SEARCHENGINE_KEYWORD | 5 | 45 | 4630 (1)| 00:00:56 |
  30. |* 7 | TABLE ACCESS BY INDEX ROWID| SEARCHENGINE_KEYWORD | 1 | 37 | 5 (0)| 00:00:01 |
  31. |* 8 | INDEX RANGE SCAN | I_SEARCHENGINE_KEYWORD_PROVID | 2 | | 3 (0)| 00:00:01 |
  32. -----------------------------------------------------------------------------------------------------------------
  33. Peeked Binds (identified by position):
  34. --------------------------------------
  35. 1 - :1 (NUMBER): 100015402133
  36. Predicate Information (identified by operation id):
  37. ---------------------------------------------------
  38. 1 - filter( IS NOT NULL)
  39. 3 - filter((COUNT(*)<2 AND COUNT(*)>0))
  40. 5 - access("B"."KEYWORD"="C"."KEYWORD")
  41. 6 - filter("B"."KEYWORD"=:B1)
  42. 7 - filter(("C"."KEYWORD"=:B1 AND "C"."TYPE"=1 AND "C"."STATE"=0 AND "C"."ENDDATE" IS NOT NULL AND
  43. "C"."BEGINDATE"<SYSDATE@! AND "C"."KEYWORD" IS NOT NULL))
  44. 8 - access("C"."PROVIDERID"=:1)

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

改写如下:

  1. explain plan for SELECT a.id,2 a.orderid,3 a.keyword,4 a.begindate,5 a.enddate,6 a.providerid
  2. 7 FROM searchengine_keyword a
  3. 8 WHERE a.keyword in
  4. 9 (SELECT x.keyword
  5. 10 FROM ( SELECT b.keyword,COUNT (*)
  6. 11 FROM searchengine_keyword b
  7. 12 WHERE b.keyword IN (SELECT c.keyword
  8. 13 FROM searchengine_keyword c
  9. 14 WHERE c.providerid = 100015402133
  10. 15 AND c.state = '0'
  11. 16 AND c.TYPE = '1'
  12. 17 AND c.begindate IS NOT NULL
  13. 18 AND c.enddate IS NOT NULL
  14. 19 AND c.begindate < SYSDATE
  15. 20 AND c.keyword IS NOT NULL)
  16. GROUP BY b.keyword
  17. HAVING COUNT (*) < 2 AND COUNT (*) > 0) x
  18. 23 );
  19. Explained.
  20.  
  21. select * from table(dbms_xplan.display);
  22. PLAN_TABLE_OUTPUT
  23. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  24. Plan hash value: 4028499329
  25. ------------------------------------------------------------------------------------------------------------------
  26. | Id | Operation | Name | Rows | Bytes | Cost (%cpu)| Time |
  27. ------------------------------------------------------------------------------------------------------------------
  28. | 0 | SELECT STATEMENT | | 1 | 101 | 9270 (1)| 00:01:52 |
  29. |* 1 | FILTER | | | | | |
  30. | 2 | HASH GROUP BY | | 1 | 101 | 9270 (1)| 00:01:52 |
  31. |* 3 | HASH JOIN | | 1 | 101 | 9269 (1)| 00:01:52 |
  32. | 4 | MERGE JOIN CARTESIAN | | 9768 | 877K| 4638 (1)| 00:00:56 |
  33. | 5 | SORT UNIQUE | | 1 | 37 | 5 (0)| 00:00:01 |
  34. |* 6 | TABLE ACCESS BY INDEX ROWID| SEARCHENGINE_KEYWORD | 1 | 37 | 5 (0)| 00:00:01 |
  35. |* 7 | INDEX RANGE SCAN | I_SEARCHENGINE_KEYWORD_PROVID | 2 | | 3 (0)| 00:00:01 |
  36. | 8 | BUFFER SORT | | 561K| 29M| 4633 (1)| 00:00:56 |
  37. | 9 | TABLE ACCESS FULL | SEARCHENGINE_KEYWORD | 561K| 29M| 4632 (1)| 00:00:56 |
  38. | 10 | TABLE ACCESS FULL | SEARCHENGINE_KEYWORD | 561K| 4935K| 4629 (1)| 00:00:56 |
  39. ------------------------------------------------------------------------------------------------------------------
  40. Predicate Information (identified by operation id):
  41. ---------------------------------------------------
  42. 1 - filter(COUNT(*)<2 AND COUNT(*)>0)
  43. 3 - access("A"."KEYWORD"="B"."KEYWORD" AND "B"."KEYWORD"="C"."KEYWORD")
  44. 6 - filter("C"."TYPE"=1 AND "C"."STATE"=0 AND "C"."ENDDATE" IS NOT NULL AND "C"."BEGINDATE"<SYSDATE@!
  45. AND "C"."KEYWORD" IS NOT NULL)
  46. 7 - access("C"."PROVIDERID"=100015402133)
  47. 26 rows selected.
秒杀

猜你在找的Oracle相关文章