powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подмена плана
16 сообщений из 16, страница 1 из 1
Подмена плана
    #39441370
подмена
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вырисовалась проблемка подменой плана.
SQL profiles использовать нельзя - нет лицензии.
Oracle SPM (baseline) - не работает, ибо Oracle SE.
Oracle SQL patch не работает, ибо строка хинтов больше 500 символов.
OUTLINES не получается использовать ибо непонятно как связать имеющийся правильный курсор с нужным плохим запросом.
Запрос изменить нельзя.
Что делать? И главное как.
...
Рейтинг: 0 / 0
Подмена плана
    #39441384
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подменаВырисовалась проблемка подменой плана.
SQL profiles использовать нельзя - нет лицензии.
Oracle SPM (baseline) - не работает, ибо Oracle SE.
Oracle SQL patch не работает, ибо строка хинтов больше 500 символов.
OUTLINES не получается использовать ибо непонятно как связать имеющийся правильный курсор с нужным плохим запросом.
Запрос изменить нельзя.
Что делать? И главное как.

По sql patch
https://iusoltsev.wordpress.com/2015/02/22/sql-patch-notes/
посмотри комментарии

По outlines - это именно то, для чего outlines были предназначены, "учиться, учиться и еще раз учиться".
...
Рейтинг: 0 / 0
Подмена плана
    #39441391
подмена
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nobody1111подменаВырисовалась проблемка подменой плана.
SQL profiles использовать нельзя - нет лицензии.
Oracle SPM (baseline) - не работает, ибо Oracle SE.
Oracle SQL patch не работает, ибо строка хинтов больше 500 символов.
OUTLINES не получается использовать ибо непонятно как связать имеющийся правильный курсор с нужным плохим запросом.
Запрос изменить нельзя.
Что делать? И главное как.

По sql patch
https://iusoltsev.wordpress.com/2015/02/22/sql-patch-notes/
посмотри комментарии

По outlines - это именно то, для чего outlines были предназначены, "учиться, учиться и еще раз учиться".

Жаль, что люди не умеют читать - в комментариях идёт речь про SQL profile.
"С помощью указанной DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE можно делать большие патчи".
Я написал, что SQL profie я не могу использовать.

Про outlines - не понял, что ты хотел сказать.
...
Рейтинг: 0 / 0
Подмена плана
    #39441426
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подменаЖаль, что люди не умеют читать - в комментариях идёт речь про SQL profile.
"С помощью указанной DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE можно делать большие патчи".
Я написал, что SQL profie я не могу использовать.

SQL Profile в SE вообще как класс не может использоваться, только с EE, а не по причине отсутствия лицензии на опцию.
У Ильи Деева тоже SE, и он, тем не менее, планировал, судя по комменту, что-то на основе этого использовать.
...
Рейтинг: 0 / 0
Подмена плана
    #39441438
подмена
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nobody1111подменаЖаль, что люди не умеют читать - в комментариях идёт речь про SQL profile.
"С помощью указанной DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE можно делать большие патчи".
Я написал, что SQL profie я не могу использовать.

SQL Profile в SE вообще как класс не может использоваться, только с EE, а не по причине отсутствия лицензии на опцию.
У Ильи Деева тоже SE, и он, тем не менее, планировал, судя по комменту, что-то на основе этого использовать.

Хватит уже просто что-то писать.
Ещё раз объясняю, мы не имеем права использовать SQL profile.
...
Рейтинг: 0 / 0
Подмена плана
    #39441488
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
подмена,

SQL patches основаны на тех же profiles и отличаются лишь типом(PATCH) и отсутствием force_match:
Код: 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.
  PROCEDURE I_CREATE_PATCH(
         SQL_TEXT      IN CLOB,
         HINT_TEXT     IN VARCHAR2,
         NAME          IN VARCHAR2 := NULL,
         DESCRIPTION   IN VARCHAR2 := NULL,
         CATEGORY      IN VARCHAR2 := 'DEFAULT',
                   VALIDATE      IN BOOLEAN  := TRUE)
  IS
    RET_NAME  VARCHAR2(30);
    HS        SYS.SQLPROF_ATTR;
  BEGIN
    
    COMMIT;

    
    DBMS_SMB.CHECK_SMB_PRIV;

    
    HS := SYS.SQLPROF_ATTR(HINT_TEXT);

    RET_NAME := DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE(
      SQL_TEXT => SQL_TEXT,
      PROFILE_XML => DBMS_SMB_INTERNAL.VARR_TO_HINTS_XML(HS),
      NAME => NAME,
      DESCRIPTION => DESCRIPTION,
      CATEGORY => CATEGORY,
      CREATOR => SYS_CONTEXT('USERENV', 'SESSION_USER'),
      VALIDATE => VALIDATE,
      TYPE => 'PATCH',
      IS_PATCH => TRUE);
  END;


Так можете его использовать для наборов хинтов(аутлайнов):
тестовый код
Код: 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.
select /*SQL Patch Test*/ dummy from dual;

SELECT * FROM TABLE(dbms_xplan.display_cursor());
declare
   p_hint_set        SYS.SQLPROF_ATTR;
   p_sql_id          varchar2(13)       := '&sql_id';
   p_name            varchar2(128)      := 'SQL_PATCH_TEST1';
   p_desc            varchar2(500)      := 'SQL_PATCH_TEST1 description';
   p_category        varchar2(128)      := 'DEFAULT';
   p_validate        boolean            := true;
   RET_NAME          VARCHAR2(30);
begin
   p_hint_set:=SYS.SQLPROF_ATTR(
      q'[opt_param('optimizer_index_cost_adj' 50)]',
      q'[opt_param('optimizer_index_caching' 10)]'
   );
   for s in (select sql_fulltext
             from v$sqlarea
             where sql_id = p_sql_id) 
   loop
       RET_NAME := SYS.DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE(
         SQL_TEXT    => s.sql_fulltext,
         PROFILE_XML => SYS.DBMS_SMB_INTERNAL.VARR_TO_HINTS_XML(p_hint_set),
         NAME        => p_name,
         DESCRIPTION => p_desc,
         CATEGORY    => p_category,
         CREATOR     => SYS_CONTEXT('USERENV', 'SESSION_USER'),
         VALIDATE    => p_validate,
         TYPE        => 'PATCH',
         IS_PATCH    => TRUE
       );
   end loop;
end;
/
select /*SQL Patch Test*/ dummy from dual;

SELECT * FROM TABLE(dbms_xplan.display_cursor('','','advanced'));

exec sys.dbms_sqldiag.drop_sql_patch('SQL_PATCH_TEST1');

результат
Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
SQL> @tests/patch/1

D
-
X


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
SQL_ID  2kj0tst4rj96f, child number 0
-------------------------------------
select /*SQL Patch Test*/ dummy from dual

Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------


13 rows selected.

Enter value for sql_id: 2kj0tst4rj96f

PL/SQL procedure successfully completed.


D
-
X


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
SQL_ID  2kj0tst4rj96f, child number 0
-------------------------------------
select /*SQL Patch Test*/ dummy from dual

Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / DUAL@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('12.1.0.2')
      DB_VERSION('12.1.0.2')
      OPT_PARAM('optimizer_index_cost_adj' 50)
      OPT_PARAM('optimizer_index_caching' 10)
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      FULL(@"SEL$1" "DUAL"@"SEL$1")
      END_OUTLINE_DATA
  */

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "DUMMY"[VARCHAR2,1]

Note
-----
   - SQL patch "SQL_PATCH_TEST1" used for this statement


43 rows selected.


PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
Подмена плана
    #39441493
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
подменастрока хинтов больше 500 символов.кстати у профилей есть похожая проблема:
Код: plsql
1.
2.
3.
CREATE OR REPLACE NONEDITIONABLE TYPE sqlprof_attr
                                                                      
AS VARRAY(2000) of VARCHAR2(500)

поэтому при клонировании/закреплении аутлайнов где какая-нибудь строка длиной больше 500, ее надо разбивать. Я это делал по последнему пробелу в очередных 500 символах.
...
Рейтинг: 0 / 0
Подмена плана
    #39441729
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,
Зачем, там же есть overloaded версия с аргументом типа clob без всяких ограничений

Regards

Maxim
...
Рейтинг: 0 / 0
Подмена плана
    #39441755
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Maxim Demenko,

overloaded версия чего?
dbms_sqldiag_internal.i_create_patch - не имеет overloaded версий

dbms_sqltune_internal.i_create_sql_profile - имеет две версии, но в обоих "PROFILE_XML IN CLOB"

dbms_sqltune.import_sql_profile - имеет две версии: одна из них - sys.sqlprof_attr, а вторая - "profile_xml IN CLOB"

profile_xml - нужен тут в виде именно xml, а не чистых хинтов из аутлайна. При копировании или фиксации существующего плана их, конечно, можно получать из v$sql_plan.other_xml, но во-первых, не всегда оно заполняется, а во-вторых, достаточно геморройно. А если свои хинты писать, то все равно надо генерировать XML, а тут либо самому, либо пользоваться DBMS_SMB_INTERNAL.VARR_TO_HINTS_XML, который принимает на вход все те же sys.sqlprof_attr
...
Рейтинг: 0 / 0
Подмена плана
    #39441768
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду именно
dbms_sqltune.import_sql_profile

У нас они берутся именно из other_xml - кстати, в каких случаях это поле не заполняется -я пока с таким не сталкивался?
Та которая берет sqlprov_attr всеравно клеит хинты в хмл, так что особого смысла в ней я не вижу, если можно сразу хмл с хинтами из плана взять.

Regards

Maxim
...
Рейтинг: 0 / 0
Подмена плана
    #39441776
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Maxim Demenko,

Не анализировал, но встречал, что other_xml вообще был null. Можете на своих базах посчитать сколько с null где ID =1. А насчёт геморройности, так выковыривать outline_data было проблемой - для 10 приходилось одни запросы использовать для 11 - другие, и вообще даже на 12 xmltable до сих пор иногда ошибки выдаёт
...
Рейтинг: 0 / 0
Подмена плана
    #39441781
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Maxim Demenko,

Я даже до сих пор помню, что в 11.2 ещё в этом поле был невалидный xml
...
Рейтинг: 0 / 0
Подмена плана
    #39441835
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Подмена плана
    #39441960
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBA http://www.praetoriate.com/t_oracle_sql_stability_14_replace_non_hinted_outlines.htm
Вот этот метод я использовал до 10g.
Я что-то не помню, чтобы я его на MOS (металинке тогда) находил, там было:
How to Edit a Stored Outline to Use the Plan from Another Stored Outline (Doc ID 730062.1)
Хотя сейчас есть свежий документ: How to Switch Originial Query Outlines with Modified Query Outlines (Doc ID 2254235.1)
Этот метод с прямым update ol$hints кто видел во времена 9i на metalink.oracle.com?
Предположу, что могло не быть, т.к. опасались, что люди будут ol$hints криво править, с private outline выглядит как более безопасный вариант.
...
Рейтинг: 0 / 0
Подмена плана
    #39442796
orac_list
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Demenkoxtender,
Зачем, там же есть overloaded версия с аргументом типа clob без всяких ограничений

Regards

Maxim

Maxim Demenko,

Появилось в 12.2 (может и в 12.1, не проверял)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
FUNCTION I_CREATE_PATCH(
    SQL_ID        IN VARCHAR2,
    HINT_TEXT     IN CLOB,
    CREATOR       IN VARCHAR2,
    NAME          IN VARCHAR2 := NULL,
    DESCRIPTION   IN VARCHAR2 := NULL,
    CATEGORY      IN VARCHAR2 := 'DEFAULT',
    VALIDATE      IN BOOLEAN  := TRUE)
  RETURN VARCHAR2

FUNCTION I_CREATE_PATCH(
    SQL_TEXT      IN CLOB,
    HINT_TEXT     IN CLOB,
    CREATOR       IN VARCHAR2,
    NAME          IN VARCHAR2 := NULL,
    DESCRIPTION   IN VARCHAR2 := NULL,
    CATEGORY      IN VARCHAR2 := 'DEFAULT',
    VALIDATE      IN BOOLEAN  := TRUE)
  RETURN VARCHAR2
...
Рейтинг: 0 / 0
Подмена плана
    #39442810
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
orac_list,

прикольно, действительно с 12.2 - на 12.1 еще не было. Но основной минус так и не исправили: через прямой вызов
SYS.DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE(
TYPE => 'PATCH',
IS_PATCH => TRUE
можно добавить force_match=>true, а в I_CREATE_PATCH так и нет этого параметра...

однако какая там унутрях жесть...
Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
  FUNCTION CLOB_TO_SQLPROF_ATTR(CL CLOB) RETURN SQLPROF_ATTR
  IS
    SQLPROF_V SQLPROF_ATTR;
    OFFSET    INTEGER;
    BUF_500   VARCHAR2(500 CHAR);
    BUFLEN    INTEGER;
  BEGIN
    IF CL IS NULL THEN
      RETURN NULL;
    END IF;

    SQLPROF_V := SQLPROF_ATTR();
    OFFSET := 1;

    LOOP
      BUF_500 := DBMS_LOB.SUBSTR(CL, 500, OFFSET);
      BUFLEN := LENGTH(BUF_500);

      IF (BUFLEN > 0) THEN
        SQLPROF_V.EXTEND(1);
        SQLPROF_V(SQLPROF_V.COUNT) := BUF_500;
      END IF;

      
      EXIT WHEN (BUFLEN < 500 OR BUFLEN IS NULL);

      
      OFFSET := OFFSET + BUFLEN;
    END LOOP;

    RETURN SQLPROF_V;

  END CLOB_TO_SQLPROF_ATTR;
...
  FUNCTION I_CREATE_PATCH(
    SQL_TEXT      IN CLOB,
    HINT_TEXT     IN CLOB,
    CREATOR       IN VARCHAR2,
    NAME          IN VARCHAR2 := NULL,
    DESCRIPTION   IN VARCHAR2 := NULL,
    CATEGORY      IN VARCHAR2 := 'DEFAULT',
    VALIDATE      IN BOOLEAN  := TRUE)
  RETURN VARCHAR2
  IS
    RET_NAME  DBMS_ID;
    HS        SYS.SQLPROF_ATTR;
  BEGIN
    
    COMMIT;

    
    DBMS_SMB.CHECK_SMB_PRIV;

    
    HS := CLOB_TO_SQLPROF_ATTR(HINT_TEXT);

    RET_NAME := DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE(
      SQL_TEXT => SQL_TEXT,
      PROFILE_XML => DBMS_SMB_INTERNAL.VARR_TO_HINTS_XML(HS),
      NAME => NAME,
      DESCRIPTION => DESCRIPTION,
      CATEGORY => CATEGORY,
      CREATOR  => CREATOR,
      VALIDATE => VALIDATE,
      TYPE => 'PATCH',
      IS_PATCH => TRUE);

    RETURN RET_NAME;
  END I_CREATE_PATCH;

  
  
  
  FUNCTION I_CREATE_PATCH(
    SQL_ID        IN VARCHAR2,
    HINT_TEXT     IN CLOB,
    CREATOR       IN VARCHAR2,
    NAME          IN VARCHAR2 := NULL,
    DESCRIPTION   IN VARCHAR2 := NULL,
    CATEGORY      IN VARCHAR2 := 'DEFAULT',
    VALIDATE      IN BOOLEAN  := TRUE)
  RETURN VARCHAR2
  IS
    SQL_TEXT   CLOB;
    GETSQLTXTQ VARCHAR2(150);
    RET_NAME   DBMS_ID;
  BEGIN
    
    COMMIT;

    
    DBMS_SMB.CHECK_SMB_PRIV;

    
    BEGIN
    IF SQL_ID IS NOT NULL THEN 
      GETSQLTXTQ := 'select sql_fulltext from sys.v$sql ' || -- почему бы просто не взять из v$sqlarea
                     'where upper(sql_id) = upper(:sqlid) and '|| -- и нафига тут upper?
                     '      rownum = 1';
      EXECUTE IMMEDIATE GETSQLTXTQ INTO SQL_TEXT USING SQL_ID;
   ...



хинты будут "битыми" при таком подходе :(
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> col xx for a100
SQL> select
  2     dbms_smb_internal.VARR_TO_HINTS_XML(
  3        dbms_sqldiag_internal.CLOB_TO_SQLPROF_ATTR(
  4           to_clob(rpad(' ',490,' '))||q'[leading(a b c) ]'
  5        )
  6     ) xx
  7  from dual;

XX
----------------------------------------------------------------------------------------------------
<outline_data><hint><![CDATA[




                   leading(a ]]></hint><hint><![CDATA[b c) ]]></hint></outline_data>

...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подмена плана
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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