Этот вопрос относится к этому вопросу. Это код, который я пытаюсь использовать в 12c
SELECT * FROM DMProgDate_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 = 'Moho'
AND Phase = 'Procurement'
AND Displine = 'Q340'
ORDER BY actCode
) A
WHERE ROWNUM <= 20
) WHERE seqNum > 0
) P
);
результат
11g: менее 1 секунды
12с: более 8 секунд
Когда я вынимаю весь код разбиения на страницы (как показано ниже). запрос в 12c достаточно быстр, как 11g, НО нужен запрос на разбиение на страницы.
SELECT * FROM DMProgDate_00001
WHERE 1=1
AND ProgressOID IN (
SELECT P.OID FROM (
SELECT OID FROM DMProgress_00001
WHERE 1=1
AND Project = 'Moho'
AND Phase = 'Procurement'
AND Displine = 'Q340'
ORDER BY actCode
) P
);
Это план запроса (без разбивки на страницы) в 12c
Я попробовал OFFSET.. ключевое слово (поддержка только 12c) и optimizer_features_enable('11.2.0.4'), но результат тот же, что и выше (более 8 секунд).
Нам нужно поддерживать как 11g, так и 12c, и я знаю обходной путь, чтобы решить эту проблему (в мой предварительный вопрос), НО я не хочу оставлять его как тот же код запроса. Есть ли какая-либо опция или настройка, которая может решить этот вопрос?
добавлен план запроса в виде текста (они имеют другое имя таблицы, но имеют одинаковую структуру и содержимое таблицы)
12c - over 3 sec
Plan hash value: 3742986389
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 153 | 204 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | DMPROGDATE_00001 | 1 | 153 | 102 (0)| 00:00:01 |
|* 3 | FILTER | | | | | |
|* 4 | COUNT STOPKEY | | | | | |
|* 5 | TABLE ACCESS FULL| DMPROGRESS_00001 | 26 | 2288 | 102 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter( EXISTS (<not feasible>)
3 - filter("OID"=:B1)
4 - filter(ROWNUM<=20)
5 - filter("PROJECT"='Moho' AND "PHASE"='Procurement' AND "DISPLINE"='Q340')
Note
- dynamic statistics used: dynamic sampling (level=2)
- 1 Sql Plan Directive used for this statement
11g - 0.01 sec
Plan hash value: 833434956
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 13 | 1157 | 57 (2)| 00:00:01 |
|* 1 | HASH JOIN RIGHT SEMI| | 13 | 1157 | 57 (2)| 00:00:01 |
| 2 | VIEW | VW_NSO_1 | 3 | 81 | 34 (0)| 00:00:01 |
|* 3 | COUNT STOPKEY | | | | | |
|* 4 | TABLE ACCESS FULL| DMPROGRESS_00037 | 3 | 99 | 34 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | DMPROGDATE_00037 | 7388 | 447K| 22 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("PROGRESSOID"="OID")
3 - filter(ROWNUM<=20)
4 - filter("DISPLINE"='Q340' AND "PHASE"='Procurement' AND "PROJECT"='Moho')
EXPLAIN PLAN FOR your_sql_query
, а затемSELECT * FROM TABLE( DBMS_XPLAN.DISPLAY )
на 11.2g и 12c, а затем скопируйте и вставьте их результат как обычный текст, а не как растровые изображения. Растровые изображения очень трудно читать. Спасибо. - person krokodilko   schedule 06.01.2016... FROM (SELECT ..., ROWNUM as seqNum FROM ...) WHERE seqNum > 0
Я не уверен, чего вы пытаетесь достичь,seqNum
всегда будет больше нуля. - person Shannon Severance   schedule 06.01.2016