Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Добрый день. Столкнулся со странной проблемой : иногда проверяют поведение приложений через MON_GET_PKG_CACHE_STMT. Обратил внимание на нехороший факт - малая часть запросов, выполняющихся для Websphere, постоянно перекомпилируются оптимизатором DB2. В результате, для приложения, требующее быстродействия, db2 работает не совсем оптимально :), теряя 95% времени на постоянное пересоздание плана. Аналогичный запросы, запущенные через Optim, Toad, clp обрабатываются с однократным рассчетом плана. Прочие запросы от Websphere выполняются с однократным рассчетом плана и подобных проблем не вызывают. db2 luw 9.7fp8 @aix statement concentrator выключен Заранее спасибо за идеи и советы ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 18:11 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjuk, А сами тексты запросов совпадают байт в байт? JDBC-драйвер на сервере приложений "свежий"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2013, 23:27 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Совпадают абсолютно, драйвера обновляли, эффект стабилен. Похоже, что наблюдается при селектах из view которые используют table function. И, что самое плохое, после пересоздания table function, оптимизатор начинает нормально кэшировать план. Вариант постоянно мониторить statement cache и пересоздавать table function пока проходит, но надоедает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2013, 17:33 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2013, 20:31 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Евгений, спасибо большое ! PMR уже открыл, т.к. это дело привычное и генерирую их несколько в месяц :) C currentQueryOptimization баловаться, к сожалению, не могу, т.к., с FP6 начиная, изменение этого параметра приводит к неправильной работе XMLTABLE для vargraphic тэгов. А вот остальное попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 10:46 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
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. Кроме того, понаблюдайте за изменением compilation environment для этого executable_id: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 13:01 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Марк, спасибо за помощь. Проблема в том, что 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 23:54 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Посмотрел, нет ни одного package c REOPTVAR = Y. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 12:45 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Точнее, для всех стоит N :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 12:49 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjuk, Т.е. вы видите 2 совершенно одинаковых запроса, с одним и тем же compilation environment, но разными executable_id? Не можете показать текст такого запроса вместе с ddl представлений и функций, если они используются в запросе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 13:18 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Марк, COMP_ENV_DESC все-таки разный. Для разных запросов он отличается постоянно растущим значением в 749 (2ED) позиции. Текст запроса Код: sql 1. DDL, к сожалению, выложить не могу, т.к. это будет нарушением договора с работодателем :( Но, в общих словах, состоит он из 12 запросов, обьединенных с помощью UNION ALL, в запросах присутствуют table function, scalar function и view. Результат запроса записывается в GLOBAL TEMPORARY TABLE. На тестовых DB2 9.7, имеющихся в моем распоряжении, подобная проблема отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 14:24 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjuk, Нет, само значение COMP_ENV_DESC не надо сравнивать. Надо сравнивать "расшифровку", т.е. разницу в выводе: Код: sql 1. 2. 3. 4. на разных executable_id с совпадающими текстами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 14:44 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjuk, Ну и на всякий случай всё же проверьте, тексты точно совпадают или нет. Типа: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2013, 14:59 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Марк, спасибо за помощь. Compilation Environment oтличается только значением RESOLUTION_TIMESTAMP Хэш, к сожалению, совпадает Код: sql 1. 2. 3. 4. Попробую проанализировать DYNAMICRULES для пакетов, выполняющихся нормально и не нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 11:52 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2013, 18:57 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 14:45 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjuk, Ну, похоже, что так оно работает, когда GTT используются. Если из разных соединений запрос идёт, то, несмотря на то, что GTT та же, для разных сессий всё-таки она разная. Вот тест Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 16:34 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjukТаблица создана как CREATE GLOBAL TEMPORARY TABLE Поэтому и будут разные планы. Таблица для каждой сессии своя - т.е. это НОВЫЙ объект => новый запрос. Интересно будет проверить, можно ли это обойти через статику? Марк? Andy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 17:42 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteinaserdjuk, Ну, похоже, что так оно работает, когда GTT используются. Если из разных соединений запрос идёт, то, несмотря на то, что GTT та же, для разных сессий всё-таки она разная. Т.е. оно рассматривает такой запрос как один и тот же только внутри сессии из-за использования временной таблицы. Марк, похоже на это, т.к. польский ibm указал на cgtt при вторичном анализе проблемы. Правда, на тестовых средах данный эффект совершенно не наблюдается. Код: sql 1. 2. 3. 4. 5. 6. 7. И, к тому же, аналогичная проблема наблюдается для запросов из view без использования cgtt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:32 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
aserdjukМарк, похоже на это, т.к. польский ibm указал на cgtt при вторичном анализе проблемы. Правда, на тестовых средах данный эффект совершенно не наблюдается. ... И, к тому же, аналогичная проблема наблюдается для запросов из view без использования cgttЯ правильно понял, что вы делаете просто select * from view (без insert into my_gtt ...), в определении view нет ссылок на CGTT, и видите 2 разные записи в кэше? A.PanskikhИнтересно будет проверить, можно ли это обойти через статику?Нет. Такие запросы получают т.н. incremental bind опцию в соответствующей секции пакета. Т.е. для этой секции будет SYSIBM.SYSSECTION.VALID='R', и этот запрос будет перекомпилироваться при первом доступе в сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 09:22 |
|
||
|
Выполнение запросов из WAS на DB2
|
|||
|---|---|---|---|
|
#18+
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 ограничением по количеству сессий. Увеличится вероятность того, что запрос к функции будет выполняться в одной сессии многократно и не будет требовать перекомпиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 10:36 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=38477246&tid=1601228]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 169ms |

| 0 / 0 |
