Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! DB2 8.1.14 Есть web-приложение под WAS, которое работает с базой DB2. В основном идет работа по поиску (имеется в наличии фильтр), добавлению и редактированию записей. Структура базы не сложная. 3 таблицы, связанных между собой - TAB1 ->> TAB2 ->> TAB3. Пользователи иногда замечают сбои в работе программы. При изменении записи редко возникают ошибки. Лог ВебСферы systemout.log говорит об исключении Код: plaintext db2diag.log в эти моменты говорит: Код: plaintext 1. 2. 3. 4. 5. 6. Программка сбора статистики показывает, что с момента активации базы набралось 45 Lock Escalations и 10 Lock Timeouts. Ещё программка статистики говорит, что очень много переполнений по сортировкам (Sort Overflows). Web-приложение и скрипты, которые импользуются, не совершенны. Много используется конструкций ORDER BY и условий where по полям таблиц, индексы на которые не созданы. Что можно подкрутить в базе, чтобы избежать блокировок или уменьшить? SortHeap, MaxLocks, LockTimeout? Или может еще чего? Размер буферпула увеличить? Может пойти на создание индексов по используемым полям? P.S. Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20. С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 15:31 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen Popov Что можно подкрутить в базе, чтобы избежать блокировок или уменьшить? SortHeap, MaxLocks, LockTimeout? Или может еще чего? Размер буферпула увеличить? Может пойти на создание индексов по используемым полям? Блокировки и сортировки прямо не связаны между собой. Из всего перечисленного только индексы могут реально помочь. Надо изучать планы выполнения запросов и создавать индексы. Против sort overflows - те же индексы и, возможно, sortheap, но могут быть побочные явления (например, оптимизатор будет предпочитать table scan с последующей сортировкой доступу по индексу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2009, 20:15 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Спасибо. Будем работать. Данных не много, и структура базы сравнительно не сложная. Поэтому, думаю, индексы нужно создать и использовать. А вот чтобы уменьшить количество расширений блокирововк, думаю, увеличить параметр процент списков блокировки на программу (MAXLOCKS). Сейчас ситуация такая: Код: plaintext 1. 2. Появление ожиданий блокировки (Lock Timeouts) говорит о том, что часто возникают расширения блокировок. Если увеличить процент списка блокировки (MAXLOCKS), то раширений блокировок будет меньше, а там и ожидания реже пойдут. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 10:59 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen Popov Появление ожиданий блокировки (Lock Timeouts) говорит о том, что часто возникают расширения блокировок. Если увеличить процент списка блокировки (MAXLOCKS), то раширений блокировок будет меньше, а там и ожидания реже пойдут. Так? Не обязательно. Вам, я думаю, стоит посмотреть на lock snapshot, чтобы узнать правду. В любом случае этим стоит заняться после создания подходящих индексов, поскольку они могут разрешить проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2009, 16:00 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Спасибо. Понял. Сейчас посмотрел планы часто выполняющихся запросов (даже опреация select), и там, действительно, на некоторых шагах выполнения запроса встречается "INTENT SHARE table lock". Например один из шагов выполнения запроса выглядит так Код: plaintext 1. 2. 3. Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы. Вопрос по индексам. Хочу создать новые индексы в отдельном табличном пространстве. Какие рекомендации (по настройке пространства, размещению или еще чего-нибудь) можете дать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 10:42 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen PopovСейчас посмотрел планы часто выполняющихся запросов (даже опреация select), и там, действительно, на некоторых шагах выполнения запроса встречается "INTENT SHARE table lock". Например один из шагов выполнения запроса выглядит так Код: plaintext 1. 2. 3. Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы.Перед накладыванием S строчной блокировки всегда накладывается IS табличная блокировка (на соотв. таблицу, если ещё её не было), и это не эскалация блокировок . Она несовместима с X и Z табличными блокировками, и это - её единственный side effect, так сказать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 14:18 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen Popov Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы. Вам надо бояться сканирования таблиц (relation scan) и полного чтения индексов, потому что именно они вызывают эскалацию и таймауты. Semen Popov Хочу создать новые индексы в отдельном табличном пространстве. Думаю, что в вашей ситуации ("Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20") тратить на это время и силы не стоит. Если на сервере достаточно памяти, индексы прекрасно уживутся в одном пространстве с данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 16:07 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinПеред накладыванием S строчной блокировки всегда накладывается IS табличная блокировка (на соотв. таблицу, если ещё её не было), и это не эскалация блокировок. Она несовместима с X и Z табличными блокировками, и это - её единственный side effect, так сказать...Спасибо. Но тем не менее эскалации возникают. И связаны с процентом блокировок. Возможно, не с S строчными блокировками. mustaccioДумаю, что в вашей ситуации ("Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20") тратить на это время и силы не стоит. Если на сервере достаточно памяти, индексы прекрасно уживутся в одном пространстве с данными.Спасибо. Последуем Вашему совету. mustaccioВам надо бояться сканирования таблиц (relation scan) и полного чтения индексов, потому что именно они вызывают эскалацию и таймауты. Вот это, думаю, уже ближе к моей ситуации. Запустил мониторинг базы со всеми ключами(switches) и сбросил все его счетчики. Через полчаса сделал snapshot и нашел в нем следующее: Код: plaintext 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. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. Мне интересны результаты в строках Locks held by application , Lock escalations , Rows written . Последний вообще удивляет. Так должно быть? И еще. В скриптах приложения часто используются конструкции select count(*) ... . Слышал, что такие скрипты всегда сканируют таблицу. Может они создают эскалацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 16:49 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Я думаю, вам надо определить запросы, вызывающие эскалацию блокировок, и посмотреть на их планы. Например, следующим образом: 1. Сообщения об эскалации блокировок пишутся в db2diag.log. Выполните "db2diag -gi message:=escalation", и вы увидите таблицы, на которых это происходит. 2. Найдите в снапшоте динамических запросов те, в которых участвуют таблицы из пункта 1. 3. Постройте планы запросов из пункта 2 и найдите те, где могут возникать эскалации (присутствует relation scan или полное сканирование индекса). Если таких нет, придется запустить каждый запрос вручную и определить, какой из них вызывает проблему. После этого можно попытаться найти индекс, который бы уменьшал размер выборки. Не всегда это удастся, впрочем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 19:50 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen PopovМне интересны результаты в строках Locks held by application , Lock escalations , Rows written . Последний вообще удивляет. Так должно быть? И еще. В скриптах приложения часто используются конструкции select count(*) ... . Слышал, что такие скрипты всегда сканируют таблицу. Может они создают эскалацию? rows_written включает операции с temporary table тоже. Самое ужасное в этом снэпшоте, это соотношение: Код: plaintext 1. Большое число в Locks held by application при: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2009, 10:19 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
mustaccio, Mark Barinstein, спасибо. Получил от вас много полезной информации. Буду копать. Еще нарыл по этой теме некоторые полезные статьи в инете Выявление и разрешение проблем блокировки в DB2 для Linux, UNIX и Windows Анализ ситуаций ожидания блокировок в DB2 для Linux, UNIX и Windows Может кому-нибудь будет тоже интересно. Вот что еще мне показал Dynamic SQL Snapshot. Это мне показалось странным. Код: plaintext 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. Таблицы TAB1(primary key (PNRID)) и TAB4(foreign key (PNRID)) связаны. Из снапшута видно, что скрипт выполнялся 628 раз и при этом суммарно считывал строки 2260147. Делю и получаю, что за один раз считывал 3600 записей. А это и есть общее количество записей TAB4. Вытащил план запроса. В нем действительно TBSCAN - индекс не используется. Вопрос: Почему не используется foreign key? Может ли оптимизатор в каких нибудь случаях не видеть foreign key? Может как-то подтолкнуть оптимизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2009, 14:54 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Semen Popov Код: plaintext 1. Таблицы TAB1(primary key (PNRID)) и TAB4(foreign key (PNRID)) связаны. Из снапшута видно, что скрипт выполнялся 628 раз и при этом суммарно считывал строки 2260147. Делю и получаю, что за один раз считывал 3600 записей. А это и есть общее количество записей TAB4. Вытащил план запроса. В нем действительно TBSCAN - индекс не используется. Вопрос: Почему не используется foreign key? Может ли оптимизатор в каких нибудь случаях не видеть foreign key? Может как-то подтолкнуть оптимизатор?Не используется foreign key? Когда вы создаёте foreign key, индекс не создаеётся автоматически по этим полям. Если вам нужен индекс по этому полю, то вы создаёте его сами и собираете статистику на саму таблицу и этот индекс. Даже при наличии индекса оптимизатор может выбрать табличное сканирование. Например, когда достаточно большой процент записей таблицы будет отбираться этим запросом (такое предположение может браться оптимизатором из собранной статистики). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2009, 16:05 |
|
||
|
Lock Escalations & Lock Timeouts
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinНе используется foreign key? Когда вы создаёте foreign key, индекс не создаеётся автоматически по этим полям. Опа! Век живи - век учись. Не знал. А для primary key и unique key индексы создаются автоматически? По крайней мере я их не создавал, а они видны в базе. А foreign-индекс не проверял и попался. Сейчас убедился, что foreign-индексов нет. Просто я пришел в DB2 из другой СУБД, а там связь между таблицами невозможна без индекса связи. Да и понятия "индекс" и "ключ" сопоставимы. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2009, 16:30 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35840535&tid=1603383]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 308ms |

| 0 / 0 |
