powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
18 сообщений из 18, страница 1 из 1
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39712996
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия 12.2.0.1.0 Enterprise Edition

Запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH /*+ MONITOR */ bb
     AS (  SELECT node_id
             FROM krm.r_prodtree_badd
            WHERE reptree_id = 1 AND node_id BETWEEN 5000 AND 7999
         ORDER BY node_id),
     bb1 AS (SELECT ROWNUM + 4999 rn, bb.* FROM bb),
     tt_1
     AS (  SELECT bb1.*
             FROM bb1
            WHERE rn <> node_id
         ORDER BY rn),
     tt_2 AS (SELECT ROWNUM rr, tt_1.* FROM tt_1),
     ss
     AS (SELECT rn newnode, (SELECT MAX (node_id) mx FROM bb) mx, 7999 cap
           FROM tt_2
          WHERE rr = 1)
SELECT CASE
          WHEN newnode IS NOT NULL THEN newnode
          WHEN mx = cap THEN 9999
          WHEN mx < cap THEN mx + 1
          WHEN newnode IS NULL THEN 5000
       END
          newnode
  FROM ss;



План
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Plan hash value: 3898179686
 
----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                | Name                        | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                         |                             |        |       |     7 (100)|          |       |       |          |
|   1 |  SORT AGGREGATE                          |                             |      1 |    13 |            |          |       |       |          |
|   2 |   VIEW                                   |                             |     33 |   429 |     2   (0)| 00:00:01 |       |       |          |
|   3 |    TABLE ACCESS FULL                     | SYS_TEMP_0FD9D7E3A_76EC0EEE |     33 |   132 |     2   (0)| 00:00:01 |       |       |          |
|   4 |  TEMP TABLE TRANSFORMATION               |                             |        |       |            |          |       |       |          |
|   5 |   LOAD AS SELECT (CURSOR DURATION MEMORY)| SYS_TEMP_0FD9D7E3A_76EC0EEE |        |       |            |          |  1024 |  1024 |          |
|*  6 |    INDEX RANGE SCAN                      | R_PRODTREE_UIDX1_BADD       |     33 |   231 |     2   (0)| 00:00:01 |       |       |          |
|*  7 |   VIEW                                   |                             |     33 |   858 |     3  (34)| 00:00:01 |       |       |          |
|   8 |    COUNT                                 |                             |        |       |            |          |       |       |          |
|   9 |     VIEW                                 |                             |     33 |   429 |     3  (34)| 00:00:01 |       |       |          |
|  10 |      SORT ORDER BY                       |                             |     33 |   858 |     3  (34)| 00:00:01 |  2048 |  2048 | 2048  (0)|
|* 11 |       VIEW                               |                             |     33 |   858 |     2   (0)| 00:00:01 |       |       |          |
|  12 |        COUNT                             |                             |        |       |            |          |       |       |          |
|  13 |         VIEW                             |                             |     33 |   429 |     2   (0)| 00:00:01 |       |       |          |
|  14 |          TABLE ACCESS FULL               | SYS_TEMP_0FD9D7E3A_76EC0EEE |     33 |   132 |     2   (0)| 00:00:01 |       |       |          |
----------------------------------------------------------------------------------------------------------------------------------------------------
 



Возвращает результат

5046
5342
5046
5342
5342
...
5342

Правильно 5342

Как посмотреть почему так ?
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713019
wurdu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На order by внутри with рассчитывать нельзя. Oracle просто поменял алгоритм в 12.2, пользуя PGA вместо temp и случайная сортировка потерялась.
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713031
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurdu,

Убрал сортировки - результат не изменился
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WITH /*+ MONITOR_000  */ bb
     AS (  SELECT node_id
             FROM krm.r_prodtree_badd
            WHERE reptree_id = 1 AND node_id BETWEEN 5000 AND 7999
    --     ORDER BY node_id
         ),
     bb1 AS (SELECT ROWNUM + 4999 rn, bb.* FROM bb),
     tt_1
     AS (  SELECT bb1.*
             FROM bb1
            WHERE rn <> node_id
  --       ORDER BY rn
         ),
     tt_2 AS (SELECT ROWNUM rr, tt_1.* FROM tt_1),
     ss
     AS (SELECT rn newnode, (SELECT MAX (node_id) mx FROM bb) mx, 7999 cap
           FROM tt_2
          WHERE rr = 1)
SELECT CASE
          WHEN newnode IS NOT NULL THEN newnode
          WHEN mx = cap THEN 9999
          WHEN mx < cap THEN mx + 1
          WHEN newnode IS NULL THEN 5000
       END
          newnode
  FROM ss;
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713042
wurdu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolev, так тут вся логика рассчитана на порядок строк, который ничем не гарантируется. Тут наверное логично использовать ROW_NUMBER() OVER (ORDER BY node_id)
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713046
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolevwurdu,

Убрал сортировки - результат не изменился
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WITH /*+ MONITOR_000  */ bb
     AS (  SELECT node_id
             FROM krm.r_prodtree_badd
            WHERE reptree_id = 1 AND node_id BETWEEN 5000 AND 7999
    --     ORDER BY node_id
         ),
     bb1 AS (SELECT ROWNUM + 4999 rn, bb.* FROM bb),
     tt_1
     AS (  SELECT bb1.*
             FROM bb1
            WHERE rn <> node_id
  --       ORDER BY rn
         ),
     tt_2 AS (SELECT ROWNUM rr, tt_1.* FROM tt_1),
     ss
     AS (SELECT rn newnode, (SELECT MAX (node_id) mx FROM bb) mx, 7999 cap
           FROM tt_2
          WHERE rr = 1)
SELECT CASE
          WHEN newnode IS NOT NULL THEN newnode
          WHEN mx = cap THEN 9999
          WHEN mx < cap THEN mx + 1
          WHEN newnode IS NULL THEN 5000
       END
          newnode
  FROM ss;



убрав сортировки Вы разрушите логику запроса

імхо, какой-то странный алгоритм (CASE)

.....
stax
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713052
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Данные берутся из индекса см план выше
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE UNIQUE INDEX KRM.R_PRODTREE_UIDX1_BADD ON KRM.R_PRODTREE_BADD
(REPTREE_ID, NODE_ID)
LOGGING
TABLESPACE KRMT
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOPARALLEL;



Можно без ORDER BY node_id
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713057
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurdu,

по любому что-то не так
WHERE rr = 1 должен вернуть одну строку
імхо так замысловато они ищут "дырку" (сбой нумерации node_id)

....
stax
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713065
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurdu,

С (ROW_NUMBER() OVER (ORDER BY node_id) работает верно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
WITH bb
     AS (  SELECT ((ROW_NUMBER() OVER (ORDER BY node_id)) + 4999) rn, node_id
             FROM krm.r_prodtree_badd
            WHERE reptree_id = 1 AND node_id BETWEEN 5000 AND 7999
    --     ORDER BY node_id
         ),
     bb1 AS (SELECT ROWNUM + 4999 rn1, bb.* FROM bb),
     tt_1
     AS (  SELECT bb1.*
             FROM bb1
            WHERE rn <> node_id
         ORDER BY rn1
         ),
     tt_2 AS (SELECT ROWNUM rr, tt_1.* FROM tt_1),
     ss
     AS (SELECT rn newnode, (SELECT MAX (node_id) mx FROM bb) mx, 7999 cap
           FROM tt_2
          WHERE rr = 1)
SELECT CASE
          WHEN newnode IS NOT NULL THEN newnode
          WHEN mx = cap THEN 9999
          WHEN mx < cap THEN mx + 1
          WHEN newnode IS NULL THEN 5000
       END
          newnode
  FROM ss;



Есть описание этой ошибки ?
Появилась в 12.2
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713071
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolev,

на 18с подойдет ?
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713081
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_KorolevошибкиНе стоит чрезмерно усложнять решение примитивной задачи и соберешь меньше граблей.
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713082
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_KorolevStax,

Данные берутся из индекса см план выше
Можно без ORDER BY node_id

імхо
так нельзя делать, оракля поменяет план, возьмет не из индекса, тогда беда

меня смещает другое, WHERE rr = 1 запрос должен вернуть 1строку, а возвращает несколько
или я что-то не понимаю?

ps
Order by in WITH clause is not preserved
считаю багой и должны исправить

....
stax
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713083
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

Да, Спасибо!
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713088
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

возможно решить можно и по другому (напр lag/lead)

но фича (with order by) может выстрелить в других задачах

.....
stax
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713557
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey_Korolev,

Один запрос:
Код: plsql
1.
2.
3.
4.
5.
bb 
AS (SELECT node_id
    FROM krm.r_prodtree_badd
    WHERE reptree_id = 1 AND node_id BETWEEN 5000 AND 7999
    ORDER BY node_id),



Второй запрос:
Код: plsql
1.
bb1 AS (SELECT ROWNUM + 4999 rn, bb.* FROM bb)



Для второго запроса bb является структурой организованной в виде кучи,
никаких обязательств по сохранению сортировки bb второй запрос не несет,
поэтому применять rownum для нумерации отсортированной выборки так нельзя.

Можно так:
Код: plsql
1.
bb1 AS (SELECT ROWNUM + 4999 rn, node_id FROM (select node_id from bb order by node_id))
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713598
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorДля второго запроса bb является структурой организованной в виде кучиwith декларируется как имя подзапроса и по сути является динамическим create view. "Структурой, организованной в виде" подзапрос становится или не становится по хотению оптимизатора. Но даже, если предположить, что with весь из себя куче рявый, это не объясняет несколько строк результата.
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713665
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot -2-]SkilledJuniorэто не объясняет несколько строк результата.

Код: plsql
1.
node_id BETWEEN 5000 AND 7999



Код: plsql
1.
ROWNUM + 4999 rn



Код: plsql
1.
rn <> node_id



rownum полученный на неотсортированной по node_id выборке превращает данный алгоритм в морской бой - попал/не попал, сколько раз попал ...
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713672
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorrownum полученный на неотсортированной ...Наложено условие rownum = 1 и поверх этого нет джоинов и других размножателей, результат должен быть одна строка.
...
Рейтинг: 0 / 0
12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
    #39713677
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Наложено условие rownum = 1 и поверх этого нет джоинов и других размножателей, результат должен быть одна строка.
У тс-а зачем то .* в запросах, полагаю перед тем как выложить запрос он удалял лишнее по его мнению, исходный запрос скорее всего выглядит несколько иначе, понять что происходит можно при наличии полного "неправильно" работающего запроса и данных на которых он "сломался".
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 12.2 Запрос возвращает разные значения! в плане CURSOR DURATION MEMORY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]