Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подмена плана / 16 сообщений из 16, страница 1 из 1
20.04.2017, 09:33
    #39441370
подмена
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена плана
Вырисовалась проблемка подменой плана.
SQL profiles использовать нельзя - нет лицензии.
Oracle SPM (baseline) - не работает, ибо Oracle SE.
Oracle SQL patch не работает, ибо строка хинтов больше 500 символов.
OUTLINES не получается использовать ибо непонятно как связать имеющийся правильный курсор с нужным плохим запросом.
Запрос изменить нельзя.
Что делать? И главное как.
...
Рейтинг: 0 / 0
20.04.2017, 09:55
    #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
20.04.2017, 10:03
    #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
20.04.2017, 10:57
    #39441426
Nobody1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена плана
подменаЖаль, что люди не умеют читать - в комментариях идёт речь про SQL profile.
"С помощью указанной DBMS_SQLTUNE_INTERNAL.I_CREATE_SQL_PROFILE можно делать большие патчи".
Я написал, что SQL profie я не могу использовать.

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

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

Хватит уже просто что-то писать.
Ещё раз объясняю, мы не имеем права использовать SQL profile.
...
Рейтинг: 0 / 0
20.04.2017, 11:59
    #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
20.04.2017, 12:05
    #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
20.04.2017, 16:17
    #39441729
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена плана
xtender,
Зачем, там же есть overloaded версия с аргументом типа clob без всяких ограничений

Regards

Maxim
...
Рейтинг: 0 / 0
20.04.2017, 16:42
    #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
20.04.2017, 16:56
    #39441768
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена плана
Я имел в виду именно
dbms_sqltune.import_sql_profile

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

Regards

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

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

Я даже до сих пор помню, что в 11.2 ещё в этом поле был невалидный xml
...
Рейтинг: 0 / 0
20.04.2017, 18:12
    #39441835
DВА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подмена плана
...
Рейтинг: 0 / 0
21.04.2017, 05:00
    #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
22.04.2017, 23:25
    #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
23.04.2017, 02:58
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подмена плана / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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