oracle 12c查询很慢

时间:2016-01-06 10:48:23

标签: oracle oracle11g subquery oracle12c

下面的代码在11g中运行良好但仅在12c中工作得如此之慢(超过10秒)。

<body>
  <ol>
    <li>
      <span>Title</span>
      <ol>
        <li>Info</li>
        <li>Info</li>
      </ol>
    </li>
  </ol>
</body>

它只有10k行,索引制作精良(我可以说因为11g经验)。我知道一些绕道而行的快速方法(低于代码 - 0.001秒)但我想知道真正的问题并修复它。

我无法理解它每个表只有一个子查询和10k行。不仅与11g相比,此查询无法超过10秒。

SELECT * FROM DMProgValue_00001
  WHERE 1=1
  AND ProgressOID IN ( 
    SELECT P.OID FROM (
      SELECT OID FROM (
        SELECT A.OID, ROWNUM as seqNum FROM (
            SELECT OID FROM DMProgress_00001 WHERE 1=1
            AND Project = 'Q539'
            ORDER BY actCode
        ) A
        WHERE ROWNUM <= 40
    ) WHERE seqNum > 20
  ) P
);


Plan hash value: 763232015

-----------------------------------------------------------------------------------------------
| Id  | Operation                 | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                   |     1 |   189 |   171   (1)| 00:00:01 |
|*  1 |  FILTER                   |                   |       |       |            |          |
|   2 |   TABLE ACCESS FULL       | DMPROGVALUE_00001 |     1 |   189 |    68   (0)| 00:00:01 |
|*  3 |   VIEW                    |                   |    20 |   800 |   103   (1)| 00:00:01 |
|*  4 |    COUNT STOPKEY          |                   |       |       |            |          |
|   5 |     VIEW                  |                   |  2916 | 78732 |   103   (1)| 00:00:01 |
|*  6 |      SORT ORDER BY STOPKEY|                   |  2916 |   130K|   103   (1)| 00:00:01 |
|*  7 |       TABLE ACCESS FULL   | DMPROGRESS_00001  |  2916 |   130K|   102   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( EXISTS (SELECT 0 FROM  (SELECT "A"."OID" "OID",ROWNUM "SEQNUM" FROM  
              (SELECT "OID" "OID" FROM "DMPROGRESS_00001" "DMPROGRESS_00001" WHERE 
              "PHASE"='Construction' AND "PROJECT"='Q539' ORDER BY "ACTCODE") "A" WHERE ROWNUM<=40) 
              "from$_subquery$_003" WHERE "SEQNUM">20 AND "OID"=:B1))
   3 - filter("SEQNUM">20 AND "OID"=:B1)
   4 - filter(ROWNUM<=40)
   6 - filter(ROWNUM<=40)
   7 - filter("PHASE"='Construction' AND "PROJECT"='Q539')

DMProgress_0001 stats
NUM_ROW : 10385
BLOCKS : 370
AVG_ROW_LEN : 176
SMAPLE_SIZE : 8263


DMProgvalue_0001 stats
NUM_ROW : 15703
BLOCKS : 244
AVG_ROW_LEN : 49
SMAPLE_SIZE : 5033
SELECT * FROM DMProgValue_00001 V,
  (SELECT OID FROM (
        SELECT A.OID, ROWNUM as seqNum FROM (
            SELECT OID FROM DMProgress_00001 WHERE 1=1
            AND Project = 'Q539'
            ORDER BY actCode
        ) A
        WHERE ROWNUM <= 40
    ) WHERE seqNum > 20
  ) P
  WHERE 1=1
  AND V.ProgressOID = P.OID;

oracle 11g自动将查询更改为Hash join但BUT 12c没有。我认为这是重点。它们是相同的结构。

0 个答案:

没有答案