Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Игорь4325
Guest
Не могу разобраться, подскажите что к чему

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


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

SELECT s.sql_id, s.child_number, s.SQL_TEXT FROM v$sql s
WHERE sql_text LIKE 'SELECT 20, t.* FROM table(DBMS_%'


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.


select * from v$sql_plan
where sql_id = '2zptv97w67nn5'


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

oracle 11.2.0.1
25 янв 13, 17:39    [13829717]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Игорь4325
Guest
Ах да, простые запросы работают, а этот почему-то нет, баг или я чего-то недогоняю?
25 янв 13, 17:44    [13829756]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
Игорь4325,

более того:)

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 трейс - там простой фильтр:

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'
28 янв 13, 16:05    [13840185]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
Нужна помощь!
Я уже признаю, что у меня руки из одного места растут, да и видимо тугодум, но поясните, что не так я делаю есть запрос
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,делаю:
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

получаю:
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)
делаю
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?
заранее благодарен всем ответившим!
3 июн 13, 11:15    [14382537]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
Paranoiac,

случаем не с AUTOTRACE запрос выполняете?
посмотрите что за запрос Oracle пытается вытащить по SQL_ID 9m7787camwh4m, child number 2
3 июн 13, 11:21    [14382585]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
A.
Guest
Paranoiac
где??почему нет этих данных ввыводе,почему не рабоет с null,null, а только с прямым указанием на sql_id и дочерний курсор?
нужно ли оставлять хинт ordered?

Потому что PL/SQL Deverloper выполняет sys.dbms_transaction.local_transaction_id; после твоего запроса.
display_cursor(null,null), в свою очередь, берет последний выполненный запрос в сессии. Делай тоже самое в SQL+, там не будет такой проблемы.
Хинт ordered влияет на порядок обработки таблиц и не имеет отношения к этой теме.
3 июн 13, 11:39    [14382724]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
usolcew,
нет, автотрейс не включен
begin :id := sys.dbms_transaction.local_transaction_id; end;
я почему он вообще вызывается
3 июн 13, 11:41    [14382737]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
A.,

а что это такое sys.dbms_transaction.local_transaction_id и зачем он его юзает?
3 июн 13, 11:42    [14382749]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
This function returns the local (to instance) unique identifier for the current transaction

это вообще зачем делается?
3 июн 13, 11:45    [14382777]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
A.,
а вообще спасибо большое,прояснил!!))
3 июн 13, 11:51    [14382829]     Ответить | Цитировать Сообщить модератору
 Re: Не работает DBMS_XPLAN.DISPLAY_CURSOR  [new]
Paranoiac
Member

Откуда: Saint Petersburg
Сообщений: 389
ах да, чуть не забыл,хинт gather_plan_statistics,конечно, хорош, но что если запрос долгоиграющий и ждать его выполнения нет никакой возможности?...пробовал установить statistics_level на all и делать explain plan, не помогло...кто-нибудь может объяснить почему?
3 июн 13, 12:03    [14382932]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить