powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает DBMS_XPLAN.DISPLAY_CURSOR
15 сообщений из 15, страница 1 из 1
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38125120
Игорь4325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу разобраться, подскажите что к чему

Запрос
Код: plsql
1.
SELECT 20, t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR(null,null,'ALLSTATS LAST')) t



Далее смотрим sql_id у него 2zptv97w67nn5:

Код: plsql
1.
2.
SELECT s.sql_id, s.child_number, s.SQL_TEXT FROM v$sql s
WHERE sql_text LIKE 'SELECT 20, t.* FROM table(DBMS_%'



Код: plsql
1.
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('2zptv97w67nn5',null,'ALL'))



Возвращает пусто, почему?

Из документации

http://docs.oracle.com/cd/E14072_01/appdev.112/e10577/d_xplan.htm You can also use the table function DISPLAY_CURSOR to display the execution plan for any loaded cursor stored in the cursor cache.

Код: plsql
1.
2.
select * from v$sql_plan
where sql_id = '2zptv97w67nn5'



План содержит.

oracle 11.2.0.1
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38125129
Игорь4325
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах да, простые запросы работают, а этот почему-то нет, баг или я чего-то недогоняю?
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38127490
usolcew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь4325,

более того:)

Код: 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.
11.2.0.1.ORCL112@SCOTT SQL> select /* DBMS_XPLAN */ sysdate from dual;

SYSDATE
---------
28-JAN-13

1 row selected.

SQL> select sql_id, child_number, substr(sql_text,1,100) from v$sql where sql_text like 'select /* DBMS_XPLAN */ sysdate from dual%';

SQL_ID        CHILD_NUMBER SUBSTR(SQL_TEXT,1,100)
------------- ------------ ----------------------------------------------------------------------------------------------------
6p0v5putxtqt8            0 select /* DBMS_XPLAN */ sysdate from dual

1 row selected.

SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR('6p0v5putxtqt8',null,'ALL'));

no rows selected

SQL> select operation from v$sql_plan where sql_id = '6p0v5putxtqt8';

OPERATION
------------------------------
SELECT STATEMENT
FAST DUAL



смотрите SQL трейс - там простой фильтр:

Код: plsql
1.
select /* EXEC_FROM_DBMS_XPLAN */ case when upper(sql_text) like '%DBMS_XPLAN%' then 0 else 1 end case, SQL_ID, child_number from v$sql where SQL_ID ='6p0v5putxtqt8'
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283327
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужна помощь!
Я уже признаю, что у меня руки из одного места растут, да и видимо тугодум, но поясните, что не так я делаю есть запрос
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT /*+ ORDERED */
SUM(DECODE(A3.C_DT,1,(-A1.C_SUMMA),A1.C_SUMMA)) C_SUMMA,
MIN(A1.C_VALUTA) C_VALUTA FROM Z#TAKE_IN_DEBT A3, Z#VID_OPER_DOG A2,
Z#FACT_OPER A1 WHERE A1.COLLECTION_ID=2056613371 AND A1.C_OPER=A2.ID
AND A2.C_TAKE_DEBT=A3.COLLECTION_ID AND (A3.C_DEBT = 1984141 AND
(A1.C_DATE < to_date('06/02/2013 00:00:00','mm/dd/yyyy hh24:mi:ss')+1))


мне нужно получить на него A-ROWS и E-ROWS и все остальную статистику IO,делаю:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> SELECT /*+ gather_plan_statistics */ SUM(DECODE(A3.C_DT,1,(-A1.C_SUMMA),A1.C_SUMMA)) C_SUMMA, MIN(A1.C_VALUTA) C_VALUTA
  2  FROM Z#TAKE_IN_DEBT A3, Z#VID_OPER_DOG A2, Z#FACT_OPER A1
  3  WHERE A1.COLLECTION_ID=2056613371 AND A1.C_OPER=A2.ID AND A2.C_TAKE_DEBT=A3.COLLECTION_ID AND (A3.C_DEBT = 1984141 AND (A1.C_DATE < to_date('06/02/2013 00:00:00','mm/dd/yyyy hh24:mi:ss')+1))
  4  ;
 
   C_SUMMA   C_VALUTA
---------- ----------
   -977.25      43353


получаю:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  9m7787camwh4m, child number 2
begin :id := sys.dbms_transaction.local_transaction_id; end;
NOTE: cannot fetch plan for SQL_ID: 9m7787camwh4m, CHILD_NUMBER: 2
      Please verify value of SQL_ID and CHILD_NUMBER;
      It could also be that the plan is no longer in cursor cache (check v$sql_p
 
8 rows selected


почему???
начинаю искать по тексту в v$sql,нахожу этот запрос( sql_id у этого запроса само собой отличен от этого же запроса с хинтом ordered)
делаю
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> select * from table(dbms_xplan.display_cursor('60u5823t3nvcf',0,'iostats last'));
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  60u5823t3nvcf, child number 0
-------------------------------------
 SELECT /*+ gather_plan_statistics */
SUM(DECODE(A3.C_DT,1,(-A1.C_SUMMA),A1.C_SUMMA)) C_SUMMA,
MIN(A1.C_VALUTA) C_VALUTA FROM Z#TAKE_IN_DEBT A3, Z#VID_OPER_DOG A2,
Z#FACT_OPER A1 WHERE A1.COLLECTION_ID=2056613371 AND A1.C_OPER=A2.ID
AND A2.C_TAKE_DEBT=A3.COLLECTION_ID AND (A3.C_DEBT = 1984141 AND
(A1.C_DATE < to_date('06/02/2013 00:00:00','mm/dd/yyyy hh24:mi:ss')+1))
Plan hash value: 798328220
--------------------------------------------------------------------------------
| Id  | Operation                     | Name                          | Starts |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                               |      1 |
|   1 |  SORT AGGREGATE               |                               |      1 |
|   2 |   NESTED LOOPS                |                               |      1 |
|   3 |    NESTED LOOPS               |                               |      1 |
|   4 |     NESTED LOOPS              |                               |      1 |
|*  5 |      INDEX RANGE SCAN         | IDX_Z#TAKE_IN_DEBT_DBT_COL_DT |      1 |
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  6 |      INDEX RANGE SCAN         | IDX_Z#VID_OPER_DOG_DEBT_ID    |      6 |
|*  7 |     INDEX RANGE SCAN          | IDX_Z#FACT_OPER_CALC          |      6 |
|   8 |    TABLE ACCESS BY INDEX ROWID| Z#FACT_OPER                   |      1 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - access("A3"."C_DEBT"=1984141)
   6 - access("A2"."C_TAKE_DEBT"="A3"."COLLECTION_ID")
   7 - access("A1"."COLLECTION_ID"=2056613371 AND "A1"."C_OPER"="A2"."ID" AND "A
              00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
       filter("A1"."C_OPER"="A2"."ID")
 
34 rows selected


где??почему нет этих данных ввыводе,почему не рабоет с null,null, а только с прямым указанием на sql_id и дочерний курсор?
нужно ли оставлять хинт ordered?
заранее благодарен всем ответившим!
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283337
usolcew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Paranoiac,

случаем не с AUTOTRACE запрос выполняете?
посмотрите что за запрос Oracle пытается вытащить по SQL_ID 9m7787camwh4m, child number 2
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283370
A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
A.
Гость
Paranoiacгде??почему нет этих данных ввыводе,почему не рабоет с null,null, а только с прямым указанием на sql_id и дочерний курсор?
нужно ли оставлять хинт ordered?

Потому что PL/SQL Deverloper выполняет sys.dbms_transaction.local_transaction_id; после твоего запроса.
display_cursor(null,null), в свою очередь, берет последний выполненный запрос в сессии. Делай тоже самое в SQL+, там не будет такой проблемы.
Хинт ordered влияет на порядок обработки таблиц и не имеет отношения к этой теме.
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283376
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
usolcew,
нет, автотрейс не включен
begin :id := sys.dbms_transaction.local_transaction_id; end;
я почему он вообще вызывается
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283379
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A.,

а что это такое sys.dbms_transaction.local_transaction_id и зачем он его юзает?
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283391
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
This function returns the local (to instance) unique identifier for the current transaction


это вообще зачем делается?
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283407
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A.,
а вообще спасибо большое,прояснил!!))
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #38283431
Paranoiac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ах да, чуть не забыл,хинт gather_plan_statistics,конечно, хорош, но что если запрос долгоиграющий и ждать его выполнения нет никакой возможности?...пробовал установить statistics_level на all и делать explain plan, не помогло...кто-нибудь может объяснить почему?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #39843558
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Paranoiacах да, чуть не забыл,хинт gather_plan_statistics,конечно, хорош, но что если запрос долгоиграющий и ждать его выполнения нет никакой возможности?...пробовал установить statistics_level на all и делать explain plan, не помогло...кто-нибудь может объяснить почему?

сорри за некромантию, но в гугле это первая тема с sql.ru про мою проблему. Заодно отвечу на этот вопрос - можно попробовать так:
Код: sql
1.
select dbms_sqltune.report_sql_monitor(sql_id => '34jfjj7sa0vwb', type => 'TEXT', report_level => 'ALL') as report from dual;

если там ничего нет = то хинт monitor поможет, но зачастую долгоиграющие запросы и так мониторятся.

А у меня проблема, что хоть запрос и выполняется около минуты, dbms_xplan.display_cursor возвращает:
автор22 ----------------------------------------------------------------------------------------------------------
23 | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time |
24 ----------------------------------------------------------------------------------------------------------
25 | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 |
26 | 1 | SORT AGGREGATE | | 0 | 1 | 0 |00:00:00.01 |
....................................................

т.е врет что ничего не вернулось и про время. Это баг?
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #39843580
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версия - 12.2.0.1.0
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #39843590
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkomyagkii_newbiт.е врет что ничего не вернулось и про время. Это баг?

PL/SQL функции приводят к некорректным A-time.
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
SQL> select /*+ gather_plan_statistics*/'x'--burn_cpu()
  2    from big
  3   where rownum <= 10
  4     and burn_cpu(id)=0;

'
-
x
x
x
x
x
x
x
x
x
x

Elapsed: 00:00:10.25
SQL>
SQL> select * from table(dbms_xplan.display_cursor(format=> 'allstats last'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  azmk9tv93jjn4, child number 0
-------------------------------------
select /*+ gather_plan_statistics*/'x'--burn_cpu()   from big  where
rownum <= 10    and burn_cpu(id)=0

Plan hash value: 1743335423

--------------------------------------------------------------------------------------
| Id  | Operation           | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |      1 |        |     10 |00:00:00.13 |      23 |
|*  1 |  COUNT STOPKEY      |      |      1 |        |     10 |00:00:00.13 |      23 |
|   2 |   PARTITION HASH ALL|      |      1 |     10 |     10 |00:00:00.13 |      23 |
|*  3 |    TABLE ACCESS FULL| BIG  |      1 |     10 |     10 |00:00:00.13 |      23 |
--------------------------------------------------------------------------------------

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

   1 - filter(ROWNUM<=10)
   3 - filter("BURN_CPU"("ID")=0)


Причем, в случае "чистого" PL/SQL Это еще можно отследить по V$SQLSTATS.PLSQL_EXEC_TIME, в случаях вызова SQL из PL/SQL уже не удастся (что правильно, см: https://jonathanlewis.wordpress.com/2019/03/21/lost-time/)
A-Rows неверный не попадался. Какой format в dbms_xplan.display_cursor? параллельные запросы требуют all, с учетом того, что это будет кумулятивная статистика. Что в v$sql_plan_statistics/v$sql_plan_statistics_all?
Правильный ли child_cursor подаётся в dbms_xplan.display_cursor?
...
Рейтинг: 0 / 0
Не работает DBMS_XPLAN.DISPLAY_CURSOR
    #39844135
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate,

спасибо, запрос с использованием пользовательских функций. Адаптивный план один, чайлдов не было. Формат allstats +outline. Вьюхи если еще обратятся посмотрим..
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не работает DBMS_XPLAN.DISPLAY_CURSOR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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