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

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

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

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

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

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

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

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

Вариант постоянно мониторить statement cache и пересоздавать table function пока проходит, но надоедает :)
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38466952
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
Выполнение запросов из WAS на DB2
    #38470892
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений,
спасибо большое !

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

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

А вот остальное попробую.
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38471136
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38472139
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк, спасибо за помощь.
Проблема в том, что 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
Выполнение запросов из WAS на DB2
    #38472764
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел, нет ни одного package c REOPTVAR = Y.
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38472769
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точнее, для всех стоит N :)
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38472819
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aserdjuk,

Т.е. вы видите 2 совершенно одинаковых запроса, с одним и тем же compilation environment, но разными executable_id?
Не можете показать текст такого запроса вместе с ddl представлений и функций, если они используются в запросе?
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38472929
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк,
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
Выполнение запросов из WAS на DB2
    #38472967
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38473002
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38474006
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Марк,
спасибо за помощь.

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


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

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





Попробую проанализировать DYNAMICRULES для пакетов, выполняющихся нормально и не нормально.
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38474842
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38476700
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38476949
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38477102
A.Panskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aserdjukТаблица создана как CREATE GLOBAL TEMPORARY TABLE

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

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

Andy
...
Рейтинг: 0 / 0
Выполнение запросов из WAS на DB2
    #38477246
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38477637
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38477761
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Выполнение запросов из WAS на DB2
    #38486994
aserdjuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смешно, но изменение таблицы с CGTT на обычную не помогло.
Рою дальше.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Выполнение запросов из WAS на DB2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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