powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Медленный запрос в стиле xmltype.createxml(cursor(select ...
3 сообщений из 3, страница 1 из 1
Медленный запрос в стиле xmltype.createxml(cursor(select ...
    #39845903
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется некая компонента (java), которая из sql-запроса делает констукцию типа

select xmltype.createxml(cursor( select foo from bar )).getClobVal() from dual

Работала она лет 10+ нормально, но с последним апгрейдом на 12.2.0.1 работать перестала. Не совсем, но практически: сложные запросы, которые отрабатывают за 10 секунд, в такой обертке работают по 30+ минут. На тестовой линии разница в 2 раза, что тоже странно, но терпимо.

План отличается, но на глаз даже в варианте с xmltype не катастрофичный. Можно ли как-то заставить их работать адекватно? Хинты, аутлайны - не вариант, через схему работают десятки запросов. Хинт opt_param('optimizer_features_enable' тоже не помог, да и дело, похоже, не в sql.

И да, история традиционная, прользователь бесправный, поэтому особо приветствуются советы без админских полномочий, на худой конец точечные. Очень надеюсь на какие-то настройки пулов памяти или еще чего-то, что влияет на xdk
...
Рейтинг: 0 / 0
Медленный запрос в стиле xmltype.createxml(cursor(select ...
    #39845962
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СэмкаПлан отличается, но на глаз даже в варианте с xmltype не катастрофичный.
xmltype.createxml(cursor(stmt)) - stmt выполняется внутри xmltype. top-level statement - не дает полной картины по nested stmt.
Например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> select /*+ monitor gather_plan_statistics*/xmltype.createxml(cursor(select * from big where id=100500)) from dual;

XMLTYPE.CREATEXML(CURSOR(SELECT*FROMBIGWHEREID=100500))
----------------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
  <ROW>
    <ID>100500</ID>
    <PAD>x
   </PAD>
    <VAL>0</VAL>
  </ROW>
</ROWSET>


Elapsed: 00:00:07.05


Trace file:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
PARSING IN CURSOR #139767668692080 len=113 dep=0 uid=138 oct=3 lid=138 tim=3101973252663 hv=4265235640 ad='c7b942e8' sqlid='4d4fh0zz3np5s'
select /*+ monitor gather_plan_statistics*/xmltype.createxml(cursor(select * from big where id=100500)) from dual
...
PARSING IN CURSOR #139767665048600 len=99 dep=2 uid=138 oct=3 lid=138 tim=3101973457486 hv=2683116143 ad='bce225a0' sqlid='5c38sa2gyu6mg'
SELECT "BIG"."ID" "ID","BIG"."PAD" "PAD","BIG"."VAL" "VAL" FROM "BIG" "BIG" WHERE "BIG"."ID"=100500
END OF STMT
...
STAT #139767665048600 id=1 cnt=1 pid=0 pos=1 obj=137739 op='TABLE ACCESS FULL BIG (cr=158534 pr=156897 pw=0 str=1 time=105485 us cost=43205 size=109 card=1)'
...
STAT #139767668692080 id=1 cnt=0 pid=0 pos=1 obj=137739 op='TABLE ACCESS BY INDEX ROWID BATCHED BIG (cr=0 pr=0 pw=0 str=0 time=0 us cost=4 size=109 card=1)'
STAT #139767668692080 id=2 cnt=0 pid=1 pos=1 obj=137741 op='INDEX RANGE SCAN BIG_ID_I (cr=0 pr=0 pw=0 str=0 time=0 us cost=3 size=0 card=1)'
STAT #139767668692080 id=3 cnt=1 pid=0 pos=2 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 str=1 time=2 us cost=2 size=0 card=1)'


rowsource statistics:
Код: 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.
SQL> select * from table(dbms_xplan.display_cursor('4d4fh0zz3np5s', null, 'allstats last'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  4d4fh0zz3np5s, child number 0
-------------------------------------
select /*+ monitor gather_plan_statistics*/xmltype.createxml(cursor(sele
ct * from big where id=100500)) from dual

Plan hash value: 3016543793

------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name     | Starts | E-Rows | A-Rows |   A-Time   |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |          |      1 |        |      1 |00:00:00.01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| BIG      |      0 |      1 |      0 |00:00:00.01 |
|*  2 |   INDEX RANGE SCAN                  | BIG_ID_I |      0 |      1 |      0 |00:00:00.01 |
|   3 |  FAST DUAL                          |          |      1 |      1 |      1 |00:00:00.01 |
------------------------------------------------------------------------------------------------

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

   2 - access("ID"=100500)


21 rows selected.


real-time sql monitoring report:
Код: 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.
46.
47.
select dbms_sqltune.report_sql_monitor('4d4fh0zz3np5s') from dual;

DBMS_SQLTUNE.REPORT_SQL_MONITOR('4D4FH0ZZ3NP5S')
---------------------------------------------------------------------------------------------------------------
SQL Monitoring Report

SQL Text
------------------------------
select /*+ monitor gather_plan_statistics*/xmltype.createxml(cursor(select * from big where id=100500)) from dual

Global Information
------------------------------
 Status              :  DONE (ALL ROWS)
 Instance ID         :  1
 Session             :  TC (21:11922)
 SQL ID              :  4d4fh0zz3np5s
 SQL Execution ID    :  16777216
 Execution Started   :  08/06/2019 09:14:35
 First Refresh Time  :  08/06/2019 09:14:35
 Last Refresh Time   :  08/06/2019 09:14:42
 Duration            :  7s
 Module/Action       :  SQL*Plus/-
 Service             :  pdb
 Program             :  sqlplus
 Fetch Calls         :  1

Global Stats
==========================================================================
| Elapsed |   Cpu   |    IO    | PL/SQL  | Fetch | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) | Time(s) | Calls |  Gets  | Reqs | Bytes |
==========================================================================
|    6.36 |    1.21 |     5.15 |    0.00 |     1 |   159K | 1741 |   1GB |
==========================================================================

SQL Plan Monitoring Details (Plan Hash Value=3016543793)
===============================================================================================================================================
| Id |               Operation               |   Name   |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Activity | Activity Detail |
|    |                                       |          | (Estim) |      | Active(s) | Active |       | (Actual) |   (%)    |   (# samples)   |
===============================================================================================================================================
|  0 | SELECT STATEMENT                      |          |         |      |           |        |       |          |          |                 |
|  1 |   TABLE ACCESS BY INDEX ROWID BATCHED | BIG      |       1 |    4 |           |        |       |          |          |                 |
|  2 |    INDEX RANGE SCAN                   | BIG_ID_I |       1 |    3 |           |        |       |          |          |                 |
|  3 |   FAST DUAL                           |          |       1 |    2 |         6 |     +2 |     1 |        1 |          |                 |
===============================================================================================================================================


1 row selected.


Происходил FTS BIG, однако, 4d4fh0zz3np5s об этом не известно.

Нужен ASH за время работы проблемного запроса по проблемной сессии, или SQL Monitoring Report (dbms_sqltune.report_sql_monitor(type=>'ACTIVE') - чтобы видеть recursive sql), или SQL Trace (wait=true,plan_stat=ALL_EXECUTIONS).
...
Рейтинг: 0 / 0
Медленный запрос в стиле xmltype.createxml(cursor(select ...
    #39845980
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сэмкаxmltype.createxml(cursorСэмкаРаботала она лет 10+ нормально, но с последним апгрейдом на 12.2.0.1
Мы словили целый ряд проблем с похожими конструкциями при апгрейде с 12.1 на 12.2. Правда, у нас было внутри несколько cursor(), типа
Сэмкаselect xmltype.createxml(cursor( select foo, >>>cursor(select ...from ...) cur1, cursor(select ...from ....)cur2<<< from bar )) from dual
Плавающих проблем было вагон, начиная с утечек памяти, заканчивая различными ora-600. Как ни странно, но большинство проблем решил перенос такого запроса в отдельную pl/sql функцию с тем же самым запросом, но параметры передавались в параметрах функции. На самом деле, это делали для подробного логгирования параметров и ошибок, но, как ни странно, в итоге это решило все проблемы. Мы для теста переходили опять на просто запрос и снова начинали периодически вывалиться ошибки. Впрочем, я еще тогда сказал, что надо переделать на нормальную генерацию xml без xmltype(cursor()) и полгода назад переделали. С тех пор вообще никаких проблем.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Медленный запрос в стиле xmltype.createxml(cursor(select ...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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