Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выполнение запросов из WAS на DB2 / 22 сообщений из 22, страница 1 из 1
14.11.2013, 18:11
    #38465486
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Добрый день.

Столкнулся со странной проблемой : иногда проверяют поведение приложений через MON_GET_PKG_CACHE_STMT.

Обратил внимание на нехороший факт - малая часть запросов, выполняющихся для Websphere, постоянно перекомпилируются оптимизатором DB2.
В результате, для приложения, требующее быстродействия, db2 работает не совсем оптимально :), теряя 95% времени на постоянное
пересоздание плана.
Аналогичный запросы, запущенные через Optim, Toad, clp обрабатываются с однократным рассчетом плана.

Прочие запросы от Websphere выполняются с однократным рассчетом плана и подобных проблем не вызывают.

db2 luw 9.7fp8 @aix
statement concentrator выключен

Заранее спасибо за идеи и советы !
...
Рейтинг: 0 / 0
14.11.2013, 23:27
    #38465786
Выполнение запросов из WAS на DB2
aserdjuk,

А сами тексты запросов совпадают байт в байт?
JDBC-драйвер на сервере приложений "свежий"?
...
Рейтинг: 0 / 0
15.11.2013, 17:33
    #38466775
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Совпадают абсолютно, драйвера обновляли, эффект стабилен.

Похоже, что наблюдается при селектах из view которые используют table function.
И, что самое плохое, после пересоздания table function, оптимизатор начинает нормально кэшировать план.

Вариант постоянно мониторить statement cache и пересоздавать table function пока проходит, но надоедает :)
...
Рейтинг: 0 / 0
15.11.2013, 20:31
    #38466952
Выполнение запросов из WAS на DB2
aserdjuk,

Навскидку (без доп. диагностики) могу предложить следующее:
1. "Поиграть" с параметром currentQueryOptimization, посмотреть на результаты.
IBM Data Server Driver for JDBC and SQLJ properties for DB2 Database for Linux, UNIX, and Windows
2. Отбайндить пакеты драйвера в отдельную коллекцию с опцией reopt once или none, а потом указать эту коллекцию в настройках драйвера (параметр currentPackageSet).
Tech Tip: How to specify REOPT option for JDBC applications using IBM DB2 JCC driver
DB2Binder utility
3. Перевести критичные участки кода на использование статических пакетов (SQLJ или pureQuery).
4. Открыть PMR с описанием проблемы в IBM.
...
Рейтинг: 0 / 0
20.11.2013, 10:46
    #38470892
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Евгений,
спасибо большое !

PMR уже открыл, т.к. это дело привычное и генерирую их несколько в месяц :)

C currentQueryOptimization баловаться, к сожалению, не могу, т.к., с FP6 начиная, изменение этого параметра приводит к неправильной работе XMLTABLE для vargraphic тэгов.

А вот остальное попробую.
...
Рейтинг: 0 / 0
20.11.2013, 13:01
    #38471136
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjuk,

Добрый день.

Вы определили то, что оно перекомпилируется по росту prep_time у одного и того же executable_id?
А что выдаёт такой скрипт ниже на этот проблемный executable_id?
Он потребует существование explain таблиц в схеме вызывающего пользователя, т.к. получить reopt запроса из кэша в 9.7, похоже, по-другому нельзя.
Скрипт
Код: sql
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.
set serveroutput on/

begin
  declare executable_id VARCHAR(32);
  declare explain_schema VARCHAR(128);
  declare explain_requester VARCHAR(128);
  declare explain_time TIMESTAMP;
  declare source_name VARCHAR(128);
  declare source_schema VARCHAR(128);
  declare source_version VARCHAR(64);
  declare reopt CHAR(1);

  set executable_id = x'0100000000000000070100000000000000000000020020131119161558952000';
  set explain_schema = user;
  call EXPLAIN_FROM_SECTION (
      executable_id
    , 'M'
    , null
    , -1
    , explain_schema
    , explain_requester
    , explain_time
    , source_name
    , source_schema
    , source_version);

    select reoptvar into reopt
    from syscat.packages
    where pkgschema=source_schema and pkgname=source_name and pkgversion=source_version;

    call dbms_output.put_line('reopt: ' || reopt);
end/


Кроме того, понаблюдайте за изменением compilation environment для этого executable_id:
Код: sql
1.
2.
3.
4.
select substr(e.name, 1, 50) name, e.value
from 
  table(MON_GET_PKG_CACHE_STMT(null, x'0100000000000000070100000000000000000000020020131119161558952000', null, null)) c
, table(COMPILATION_ENV(c.COMP_ENV_DESC)) e
...
Рейтинг: 0 / 0
20.11.2013, 23:54
    #38472139
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Марк, спасибо за помощь.
Проблема в том, что executable_id у всех запросов разные. Запросы осуществляет приложение на WAS, которое работает через connection pool. Какой конкретно connection будет использован для выполнения запроса приложение не контролирует.

Для меня (я совсем не dba, а data architect с обязанностью постоянной оптимизации выполнения существующих запросов) индикатором проблемы было то, что для части запросов (нормальная ситуация) есть только одна запись в MON_GET_PKG_CACHE_STMT с постоянно растущим NUM_EXECUTIONS, а для другой части (пролемной) в MON_GET_PKG_CACHE_STMT множество записей с NUM_EXECUTIONS равным 1.

Запросы, при этом, осуществляются через один и тот же data source на WAS.

Завтра попрошу dba прогнать скрипт, с преварительным explain в схеме WAS.

Environment

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
NAME                                               VALUE
 -------------------------------------------------- --------------------------------------------------
 ISOLATION                                          RS
 QUERY_OPTIMIZATION                                 5
 MIN_DEC_DIV_3                                      NO
 DEGREE                                             5    
 SQLRULES                                           DB2
 REFRESH_AGE                                        +00000000000000.000000
...
Рейтинг: 0 / 0
21.11.2013, 12:45
    #38472764
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Посмотрел, нет ни одного package c REOPTVAR = Y.
...
Рейтинг: 0 / 0
21.11.2013, 12:49
    #38472769
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Точнее, для всех стоит N :)
...
Рейтинг: 0 / 0
21.11.2013, 13:18
    #38472819
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjuk,

Т.е. вы видите 2 совершенно одинаковых запроса, с одним и тем же compilation environment, но разными executable_id?
Не можете показать текст такого запроса вместе с ddl представлений и функций, если они используются в запросе?
...
Рейтинг: 0 / 0
21.11.2013, 14:24
    #38472929
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Марк,
COMP_ENV_DESC все-таки разный.
Для разных запросов он отличается постоянно растущим значением в 749 (2ED) позиции.

Текст запроса
Код: sql
1.
select ref_no from table( hottabich.bl_validate_noxml1( ?, ?, ?, ?, ?, ?, ?, ?)) WITH UR FOR FETCH ONLY



DDL, к сожалению, выложить не могу, т.к. это будет нарушением договора с работодателем :(
Но, в общих словах, состоит он из 12 запросов, обьединенных с помощью UNION ALL, в запросах присутствуют table function, scalar function и view. Результат запроса записывается в GLOBAL TEMPORARY TABLE.

На тестовых DB2 9.7, имеющихся в моем распоряжении, подобная проблема отсутствует.
...
Рейтинг: 0 / 0
21.11.2013, 14:44
    #38472967
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjuk,

Нет, само значение COMP_ENV_DESC не надо сравнивать.
Надо сравнивать "расшифровку", т.е. разницу в выводе:
Код: sql
1.
2.
3.
4.
select substr(e.name, 1, 50) name, e.value
from 
  table(MON_GET_PKG_CACHE_STMT(null, x'...', null, null)) c
, table(COMPILATION_ENV(c.COMP_ENV_DESC)) e

на разных executable_id с совпадающими текстами.
...
Рейтинг: 0 / 0
21.11.2013, 14:59
    #38473002
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjuk,

Ну и на всякий случай всё же проверьте, тексты точно совпадают или нет.
Типа:
Код: sql
1.
2.
3.
4.
select c.executable_id, DBMS_UTILITY.get_hash_value(c.stmt_text, 0, 4096)
from
  table(values x'...1', x'...2') id(executable_id)
, table(MON_GET_PKG_CACHE_STMT(null, id.executable_id, null, null)) c
...
Рейтинг: 0 / 0
22.11.2013, 11:52
    #38474006
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Марк,
спасибо за помощь.

Compilation Environment oтличается только значением RESOLUTION_TIMESTAMP


Хэш, к сожалению, совпадает

Код: sql
1.
2.
3.
4.
EXECUTABLE_ID                                                    2
 ---------------------------------------------------------------- ----
 00000001000000000000000000a8cccc00000000000220131122093829180895 3167
 00000001000000000000000000a8ccc600000000000220131122093825711270 3167





Попробую проанализировать DYNAMICRULES для пакетов, выполняющихся нормально и не нормально.
...
Рейтинг: 0 / 0
22.11.2013, 18:57
    #38474842
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjukDDL, к сожалению, выложить не могу, т.к. это будет нарушением договора с работодателем :(
Но, в общих словах, состоит он из 12 запросов, обьединенных с помощью UNION ALL, в запросах присутствуют table function, scalar function и view. Результат запроса записывается в GLOBAL TEMPORARY TABLE.А как вы это делаете - вставку?

- insert into my_gtt select ref_no from ...
- открыв курсор на 'select ref_no from ...', и fetch/insert в цикле
- как-то ещё

gtt - declared или created?
...
Рейтинг: 0 / 0
25.11.2013, 14:45
    #38476700
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Mark Barinstein,

заполнение осществляется
insert into ....
select val1, val2, val3 from view1 union all
select val1, val2, val3 from table( function1() ) union all
select val1, val2, val3 from view2

Таблица создана как CREATE GLOBAL TEMPORARY TABLE
...
Рейтинг: 0 / 0
25.11.2013, 16:34
    #38476949
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjuk,

Ну, похоже, что так оно работает, когда GTT используются.
Если из разных соединений запрос идёт, то, несмотря на то, что GTT та же, для разных сессий всё-таки она разная.
Вот тест
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
session1:
create global temporary table test_cgtt(i int) on commit preserve rows;
insert into test_cgtt select count(1) from syscat.tables;
insert into test_cgtt select count(1) from syscat.tables;

session2:
insert into test_cgtt select count(1) from syscat.tables;
insert into test_cgtt select count(1) from syscat.tables;
insert into test_cgtt select count(1) from syscat.tables;

select NUM_EXEC_WITH_METRICS, executable_id
from table(MON_GET_PKG_CACHE_STMT(null, null, null, null)) 
where 
  DBMS_UTILITY.get_hash_value(stmt_text, 0, 4096)
= DBMS_UTILITY.get_hash_value('insert into test_cgtt select count(1) from syscat.tables', 0, 4096)

NUM_EXEC_WITH_METRICS EXECUTABLE_ID                                                      
--------------------- -------------------------------------------------------------------
                    3 x'01000000000000009E0000000000000000000000020020131125161945828000'
                    2 x'01000000000000009C0000000000000000000000020020131125161839037000'

Т.е. оно рассматривает такой запрос как один и тот же только внутри сессии из-за использования временной таблицы.
...
Рейтинг: 0 / 0
25.11.2013, 17:42
    #38477102
A.Panskikh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjukТаблица создана как CREATE GLOBAL TEMPORARY TABLE

Поэтому и будут разные планы. Таблица для каждой сессии своя - т.е. это НОВЫЙ объект => новый запрос.

Интересно будет проверить, можно ли это обойти через статику? Марк?

Andy
...
Рейтинг: 0 / 0
25.11.2013, 19:32
    #38477246
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Mark Barinsteinaserdjuk,
Ну, похоже, что так оно работает, когда GTT используются.
Если из разных соединений запрос идёт, то, несмотря на то, что GTT та же, для разных сессий всё-таки она разная.
Т.е. оно рассматривает такой запрос как один и тот же только внутри сессии из-за использования временной таблицы.

Марк, похоже на это, т.к. польский ibm указал на cgtt при вторичном анализе проблемы.
Правда, на тестовых средах данный эффект совершенно не наблюдается.

Код: sql
1.
2.
3.
4.
5.
6.
7.
 
 EXECUTABLE_ID                                                    PREP_TIME INSERT_TIMESTAMP           NUM_EXECUTIONS NUM_EXEC_WITH_METRICS TOTAL_ACT_TIME STMT_TEXT
 ---------------------------------------------------------------- --------- -------------------------- -------------- --------------------- -------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 0000000100000000000000000000baa600000000000220131125172555658646       591 2013-11-25 17:25:47.098597              5                     5           2863 select ref_no from table( hottabich.bl_validate_noxml1( ?, ?, ?, ?, ?, ?, ?, ?)) WITH UR FOR FETCH ONLY
 0000000100000000000000000000ba8f00000000000220131125172423902913        19 2013-11-25 17:24:15.342864              3                     3             44 SELECT executable_id, PREP_TIME, INSERT_TIMESTAMP, NUM_EXECUTIONS, NUM_EXEC_WITH_METRICS, TOTAL_ACT_TIME, STMT_TEXT     FROM  TABLE(MON_GET_PKG_CACHE_STMT('D', NULL, NULL, NULL))    WHERE   lower( cast( STMT_TEXT as varchar(2048) ) ) LIKE '%bl_validate_noxml1%'  order by insert_timestamp desc  with ur
 
 



И, к тому же, аналогичная проблема наблюдается для запросов из view без использования cgtt
...
Рейтинг: 0 / 0
26.11.2013, 09:22
    #38477637
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
aserdjukМарк, похоже на это, т.к. польский ibm указал на cgtt при вторичном анализе проблемы.
Правда, на тестовых средах данный эффект совершенно не наблюдается.
...
И, к тому же, аналогичная проблема наблюдается для запросов из view без использования cgttЯ правильно понял, что вы делаете просто select * from view (без insert into my_gtt ...), в определении view нет ссылок на CGTT, и видите 2 разные записи в кэше?
A.PanskikhИнтересно будет проверить, можно ли это обойти через статику?Нет.
Такие запросы получают т.н. incremental bind опцию в соответствующей секции пакета.
Т.е. для этой секции будет SYSIBM.SYSSECTION.VALID='R', и этот запрос будет перекомпилироваться при первом доступе в сессии.
...
Рейтинг: 0 / 0
26.11.2013, 10:36
    #38477761
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Mark BarinsteinИ, к тому же, аналогичная проблема наблюдается для запросов из view без использования cgttЯ правильно понял, что вы делаете просто select * from view (без insert into my_gtt ...), в определении view нет ссылок на CGTT, и видите 2 разные записи в кэше?
[/quot]

Именно так. Условие для появления такого эффекта - использование table function во view.
Пересоздание table function, как правило, решает проблему.

CGTT, в свое время, выбрал из-за производительности, работа с ней была на 100-150мс быстрее, чем с обычной таблицей.
Попробую вернуться к решению с таблицей :(
Или попинать разработчиков, запросы к этой функции можно вынести в отдельный connection pool c ограничением по количеству сессий. Увеличится вероятность того, что запрос к функции будет выполняться в одной сессии многократно и не будет требовать перекомпиляции.
...
Рейтинг: 0 / 0
03.12.2013, 10:34
    #38486994
aserdjuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение запросов из WAS на DB2
Смешно, но изменение таблицы с CGTT на обычную не помогло.
Рою дальше.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выполнение запросов из WAS на DB2 / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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