Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Есть таблица серверов, сервер - это foreign key (SERVER_ID) в большом числе зависимых таблиц с огромным количеством записей, данные для которых собираются сервисами с разных клиентов. Порядок ~ десятки-сотни миллионов. Индексы с SERVER_ID в таблицах присутствуют. Тем не менее, удаление даже пустых серверов занимает чудовищное количество времени. Вначале процедура удаления была простой и работало каскадное удаление. При этом, естественно, "пустой" сервер удалялся очень быстро. Зато при удалении "рабочего" сервера возникали многочисленные блокировки и с сайтом, отображающим информацию со всех этих таблиц, невозможно было работать - не дождешься отображения страницы. Затем перешли на другую схему - теперь удаляется порциями, сдвигаясь на 10000 записей, при помощи курсора... Но DELETE FROM (SELECT * FROM XXX.YYY WHERE SERVER_ID = 666 FETCH FIRST 10000 ROWS ONLY) все равно на самых больших таблицах зависает на десяток минут... :( Что можно предпринять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2009, 18:08 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Nafigator, Версия и редакция db2 какие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2009, 18:20 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, 9.5.4 на AIX 64bit Кстати, немного модифицировали процедуры удаления. Теперь это выглядит так: Код: 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. Добавил также индексы, которые отсутствовали в небольшом числе зависимых таблиц (посмотрел по db2mon, на каких таблицах дольше всего "висело"). Стало заметно быстрее. Однако есть еще уровень выше - клиенты, у которых в свою очередь есть сервера :) Клиенты всё еще удаляются крайне медленно... Наверное, подобный приведенному выше подход нужно сделать и для клиентов? Т.е. проходить по всем таблицам, у которых есть foreign key CLIENT_ID и удалять порциями, используя опять-таки процедуру приведенную выше для серверов клиентов? Или подскажете какое-то дополнительное интересное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2009, 20:14 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Сделать таблицы MDC и удалять секциями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2009, 22:27 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
1. select * - это излишество. Вы не используете извлечённые записи, а это берёт время. Извлекайте любую константу, например 1 - это будет работать также хорошо, но гораздо быстрее: авторSET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' FOR UPDATE'; 2. Лучше, чем просто писать FOR UPDATE использовать FOR UPDATE of SERVER_ID - это тоже быстрее: quote автор]SET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' FOR UPDATE of SERVER_ID';[/quote] 3.Чем извлекать запись за записью - лучше извлекать блоками. После каждого извлечения блока записей EXECUTE S2; Commit; . Теперь не надо будет добавлять единицу. Зато надо подготовить поле для извлекаемого блока изменить и сделать один добавочный после окончания цикла: quote автор] a. SET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' WITH ROWSET POSITIONING FOR UPDATE of SERVER_ID'; ................. ................. ................. FETCH NEXT ROWSET C1 FOR IN_DELETE_ROWS_BLOCK_SIZE ROWS INTO DUMMY_INT[] [/quote] Lenny ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2009, 05:12 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
1. select * - это излишество. Вы не используете извлечённые записи, а это берёт время. Извлекайте любую константу, например 1 - это будет работать также хорошо, но гораздо быстрее: авторSET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' FOR UPDATE'; 2. Лучше, чем просто писать FOR UPDATE использовать FOR UPDATE of SERVER_ID - это тоже быстрее: авторSET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' FOR UPDATE of SERVER_ID'; 3.Чем извлекать запись за записью - лучше извлекать блоками . После каждого извлечения блока записей EXECUTE S2; Commit; . Теперь не надо будет добавлять единицу. Зато надо подготовить поле для извлекаемого блока изменить и сделать один добавочный после окончания цикла: автор a. SET PSTMT_SEL = 'SELECT 1 FROM ' || IN_TABLE_NAME || ' WHERE SERVER_ID = ' || TRIM(CHAR(IN_SERVER_ID)) || ' WITH ROWSET POSITIONING FOR UPDATE of SERVER_ID'; ................. ................. ................. FETCH NEXT ROWSET C1 FOR IN_DELETE_ROWS_BLOCK_SIZE ROWS INTO DUMMY_INT[] Lenny ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2009, 05:15 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Nafigator9.5.4 на AIX 64bit ... Или подскажете какое-то дополнительное интересное решение?Если у вас ESE, то можно использовать MDC: пересоздайте таблицы со своими миллионами записей как ORGANIZE BY (SERVER_ID). Если есть много SERVER_ID с низкой кардинальностью (маленькое кол-во записей), используйте extent size поменьше у табличного пространства. Также можно выставить: db2set DB2_MDC_ROLLOUT =DEFER Если не ESE, то единственное что можно сделать (если вашим алгоритмам это не повредит), это: db2set DB2_SKIPDELETED=ON db2stop db2start ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2009, 09:58 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
А у нас ещё было "секционирование для бедных" (т.е. годящееся для не-ESE) - через VIEW с UNION ALL на таблицах с соответствующими constraint'ами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2009, 12:09 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, буду по порядку двигаться :) Пока что решил модифицировать запрос, но какая-то синтакс. ошибка. В упор не вижу, в чем дело: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2009, 03:10 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
You can check the syntax: Fetch -- http://publib.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/DSNSQK16/5.65?DT=20090505112816 Declare cursor -- http://publib.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/DSNSQK16/5.47?DT=20090505112816 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2009, 04:37 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Мне кажется вам надо декларировать хост переменную типа целое , затем сделать set .... = IN_DELETE_ROWS_BLOCK_SIZE и использовать её в Fetch.... Lenny ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2009, 05:08 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Lkhiger, нет, я проверил это в самом начале - подставил вообще константу :( дело в чем-то другом. Смотрел документацию, но там примера использования в контексте не было (кое-где встречал лишь exec sql). А в частности команда выглядит верной... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2009, 10:55 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
а "логическое" удаление вместо "физического" никак не применить? интересно, а записей об эскалации а db2diag.log много? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2009, 10:49 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
NafigatorПока что решил модифицировать запрос, но какая-то синтакс. ошибка. В упор не вижу, в чем дело: ... FETCH NEXT ROWSET FROM C1 FOR IN_DELETE_ROWS_BLOCK_SIZE ROWS INTO DUMMY_INT; ...Дело в том, что вы пытаетесь применить синтаксис FETCH для DB2 for Z/OS для DB2 for LUW. В FETCH для DB2 for LUW нет Multiple-row INSERT and FETCH statements . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 09:35 |
|
||
|
Очень медленное удаление :(
|
|||
|---|---|---|---|
|
#18+
Марк, спасибо за предложение. Почитал про MDC - возможно, подойдет. Но т.к. у нас большое количество таблиц и крупная система - это серьезный вопрос, для которого необходимо много времени. Пока что пытаюсь оптимизировать существующие процедуры. Для SERVER удалось добиться более-менее приемлемого времени удаления. А вот с клиентами пока не сложилось. Вот текущий запрос: Код: 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. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. Нужные индексы, включающие CLIENT_ID, а также те, в которые входят CLUSTER_ID (это сущность, подобная SERVER_ID - тоже очень большие таблицы есть), уже созданы для всех таблиц цикла. Тем не менее, удаление клиента "подвисает" достаточно надолго, а db2mon почему-то отображает для lock wait целый ряд таблиц, хотя в каждый момент обрабатывается лишь одна (?) Я пытался удалить клиента БЕЗ серверов и кластеров, поэтому можно сосредоточиться лишь на курсоре C_CLIENT_RELATED. p.s. Под конец установил DB2_SKIPDELETED - стало быстрее, но всё еще не дотягивает до приемлемого уровня (раньше счет шел на десятки минут, сейчас клиент с 2 пустыми серверами и 2 пустыми кластерами удаляло минуту)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2009, 16:14 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=74&tid=1603015]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 185ms |

| 0 / 0 |
