|
|
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
xtenderотребилдилДостаточно coalesce. Да и сценарий стандартнейший. Не понимаю, почему широко не освещён. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:04 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровЭто не совсем так Они переиспользуютсяНет. В "скользящем окне" левые блоки переиспользуются чуть реже, чем никогда. Поверь моему многодесятилетнему опыту. Только явный coalesce помогает. Вячеслав ЛюбомудровЗдесь нет "массового" удаления, здесь оно непрерывное ОчередьС точки зрения конечного результата - без разницы. Просто в таком случае не просто совместить coalesce с delete. Вячеслав ЛюбомудровВ ранних версиях 10-ки, насколько помню с COALESCE был достаточно страшный баг, когда при его прерывании (на индексе ) можно было потерять данные таблицы .Не верю. coalesce всего лишь команда задействовать встроенные в индекс механизмы. И поэтому никого не блокирует. Только на чуть-чуть в рамках конкретного блока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:25 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicВячеслав ЛюбомудровЭто не совсем так Они переиспользуютсяНет. В "скользящем окне" левые блоки переиспользуются чуть реже, чем никогда.И я тоже какое-то время верил в переиспользование. Но в случае скользящего окна оно не работает. Даже, по-моему, у Льюиса об этом есть. Но не в столь явной форме, что при скользящем окне нужен регулярный coalesce. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:30 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
так версия 10.2, там усе может быть ) насчет данных таблицы хз, но вот данные индекса например при ребилд онлайн запросто теряются, обращаешься к таблице по индексу, а нет там ничего ) кстати и в 11 тоже воспроизводится, и в 12 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:48 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicВячеслав ЛюбомудровЭто не совсем так Они переиспользуютсяНет. В "скользящем окне" левые блоки переиспользуются чуть реже, чем никогда. Поверь моему многодесятилетнему опыту. Только явный coalesce помогает.И все же это не так У нас ежедневно в родительскую таблицу влетают сотни тысяч записей (и в дочерние соответственно миллионы), но при этом индексы не разрастаются, если вовремя разгребается (удаляется) то, что успело навалиться (вставиться) Это работает много (более 10) лет, 24*7 Проблемы возникают когда где-то происходит затык и "обработчики" сильно отстают от "агентов" (или когда левая граница умышлено "замораживается" через отрицательный ID) ElicВячеслав ЛюбомудровВ ранних версиях 10-ки, насколько помню с COALESCE был достаточно страшный баг, когда при его прерывании (на индексе ) можно было потерять данные таблицы .Не верю. coalesce всего лишь команда задействовать встроенные в индекс механизмы. И поэтому никого не блокирует. Только на чуть-чуть в рамках конкретного блока.Скорее всего, я попутал со SHRINK (но поразило именно то, что упаковывается индекс , а данные можно потерять в таблице ) Предупреждение я увидел здесь (темку вот так сразу найти не удалось), а потом нашел этот баг на металинке В общем, страшновато стало А так один из обработчиков перед началом основной деятельности проверяет, что индексы не перестраивались уже сутки и делает попытку перестроить (а не получилось, ну так и бог с ним, попробуем в следующий раз) -- при нормальной работе это занимает секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:52 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DВАно вот данные индекса например при ребилд онлайн запросто теряются, обращаешься к таблице по индексу, а нет там ничего ) кстати и в 11 тоже воспроизводится, и в 12 )Если запросто, то где тест-кэйс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:54 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DBA прикалывается Естественно, при кривом индексе попасть через него в таблицу нельзя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:56 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудровчерез отрицательный IDИменно это и могло провоцировать автоматический coalesce. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:58 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Именно это, как раз, и создает длиннющую цепочку пустых блоков, если мы идем от MIN ну и дальше по индексу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 17:00 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровИменно это, как раз, и создает длиннющую цепочку пустых блоков, если мы идем от MIN ну и дальше по индексуТы не прав. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 17:48 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Elic, в сапорте тест-кейс :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 18:26 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровПо поводу перестроения тоже свои тараканы -- до 11 нельзя было указать таймаут DDL (а может это и хорошо было), а потом еще какие-то фишки с ONLINE вылезли "Веселые" фишки с ONLINE вылезали еще в 8i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 23:33 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DВАElic, в сапорте тест-кейс :)Много пить - вредно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2017, 07:08 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicDВАElic, в сапорте тест-кейс :)Много пить - вредно. фантазировать на мой счет много вредно )) Bug 7329252 : ORA-8102 DURING REBUILD INDEX ONLINE WHEN CONCURRENT W/ UPDATES ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2017, 11:30 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicДа и сценарий стандартнейший. Не понимаю, почему широко не освещён.лень искать, но я хорошо помню, что на асктоме кайт давным-давно писал про то что именно такие кейсы надо периодически ребилдил(он писал про AQ-таблицы - они как раз такой случай), только я никогда не проверял актуальность этого в разных версиях оракла... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2017, 12:05 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Точнее aq - это iot, но как раз постоянно вставляемые справа/удаляемые слева ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2017, 12:10 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
xtenderлень искать, но я хорошо помню, что на асктоме кайтМало ли чего понапишут литературные рабы.xtenderдавным-давно писал про то что именно такие кейсы надо периодически ребилдилСаян, мне вот странно разъяснять такие, вроде как, очевидные вещи. Да если уж на то пошло, coalesce дешевле (по деньгам), чем rebuild online.Index Rebuild, the Need vs the Implications (Doc ID 989093.1)3. An index coalesce is often preferred instead of an index rebuild. It has the following advantages: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 09:30 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DВАBug 7329252Ната, я надеялся, что ты понимаешь, что тест-case - это не пустопорожние страшилки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 09:33 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicDВАBug 7329252Ната, я надеялся, что ты понимаешь, что тест-case - это не пустопорожние страшилки. Даже не знаю что тебе сказать... если зарегистрированный баг с выпущенным патчем - это пустопорожние страшилки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 11:17 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DВАДаже не знаю что тебе сказать... если зарегистрированный баг с выпущенным патчем - это пустопорожние страшилки :)Там слишком мало конкретики, что бы понять, а был ли предмет для боязни. Да и версии какие-то левенькие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 11:28 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicDВАДаже не знаю что тебе сказать... если зарегистрированный баг с выпущенным патчем - это пустопорожние страшилки :)Там слишком мало конкретики, что бы понять, а был ли предмет для боязни. Да и версии какие-то левенькие. Ну я не самый боязливый человек, но меня эта радость преследует периодически у разных заказчиков\работодателей, последний раз буквально полгода назад уже на 11.2 - при интенсивных апдейтах одних и тех же строк и параллельном перестраивание индекса в онлайне, либо перебрасывании партиций с апдейтом индексов в онлайне, в индексе теряются ключи для обновляемых строк. Для бага что я кинула под версию 10.2 тест-кейс элементарный, сама делала, но уже лет 8 назад, с 11.2 воспроизвести искусственно не получилось, видимо не все факторы учла, на на промышленной системе воспроизводился стабильно вплоть до наката патчсета и перехода на другую платформу, на 12 версии коллега показывал простенький тест-кейс, но там уже специфика связанная с недоработкой референс-партиционированных таблиц, баг 25898228, там вообще вся партиция уходит в никуда ) Так что бояться или не бояться дело добровольное, но иметь в виду стоит ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:11 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicСаян, мне вот странно разъяснять такие, вроде как, очевидные вещи. Да если уж на то пошло, coalesce дешевле (по деньгам), чем rebuild online.1. Это было давным-давно, тогда coalesce и не было... 2. А ТСу я объяснил почему лучше разок сделать ребилд: я предположил, что т.к. размер сегмента у него минимум в 10 раз больше, чем нужно, то, видимо, удаления они сделали намного позднее, чем он так разросся. Так что помимо самого просто так занимаемого места(которое, например, при IFFS будет зря сканироваться), это значит, что скорее всего ребилд и blevel может понизить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:33 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ЗЫ. от Льюиса со ссылкой на вопрос на этот же форум: https://jonathanlewis.wordpress.com/2011/03/03/index-rebuilds-4/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:36 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
он, кстати, еще пишет:автор (Actually, "shrink space compact" seems to be more efficient than "coalesce" in recent versions - but the whole AQ thing introduces some funny effects around the edges anyway.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2017, 12:40 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Всем привет, поднимаем тему после отпуска =) Алгоритм переиспользования пустых блоков индексов довольно интересен, будет жалко, если обсуждение закончится ничем. Код: plsql 1. 2. 3. 4. 5. 6. 7. Давайте начнем с едиственного кейса в теме от Elic. Я, к сожалению, не понял, что он хотел показать =( В кейсе всталяются 500к записей, потом удаляются, затем справа вставляется еще одна запись. Далее показывается, что INDEX FULL SCAN (MIN/MAX) сканирует всю цепочку листовых блоков, что естественно, скан ищет первую неудаленную запись. Нас же интересует переиспользование этих пустых блоков, хорошо покажет это вставка 250к блоков (половина объемы) справа, т.е. возрастающая последовательность. Я повторил кейс Elic, добавив в конце свои statements (для удобства чтения я опустил результаты, оставив последние значащие). Код: plsql 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. Как видим, количество чтений упало почти в 2 раза с 2819 до 1509, что как раз и показывает переиспользование пустых блоков. Далее уже мой старый тест, там идет вставка и последующее удаление разных диапазонов записей. Код: plsql 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. Результаты: ==================================================================================================== ==== Очищаем таблицу : truncate table TAB_TEST; ==== Вставляем 50000 записей : insert into TAB_TEST select rownum, 'test_' || rownum from dual connect by rownum <= 50000; ==== Удаляем 30000 записей в середине : delete TAB_TEST where id between 10001 and 40000; --Читаются пустые блоки SELECT /* TEST 1.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 2; gets = 126 [INDEX RANGE SCAN] SELECT /* TEST 1.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 1; gets = 43 [INDEX RANGE SCAN] SELECT /* TEST 1.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 85 [INDEX RANGE SCAN] SELECT /* TEST 1.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 44 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 1.5 */ ID FROM TAB_TEST T WHERE ID < 40010; rows = 10009; gets = 164 [INDEX RANGE SCAN] ==== Вставляем 20000 записей в конец : insert into TAB_TEST select rownum + 70000, 'test_' || rownum from dual connect by rownum <= 20000; --Часть пустых блоков переиспользованы повторно SELECT /* TEST 2.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 2; gets = 46 [INDEX RANGE SCAN] SELECT /* TEST 2.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 1; gets = 8 [INDEX RANGE SCAN] SELECT /* TEST 2.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 45 [INDEX RANGE SCAN] SELECT /* TEST 2.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 39 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 2.5 */ ID FROM TAB_TEST T WHERE ID < 40010; rows = 10009; gets = 84 [INDEX RANGE SCAN] ==== Вставляем 20000 записей в конец : insert into TAB_TEST select rownum + 90000, 'test_' || rownum from dual connect by rownum <= 20000; --Пустые блоки переиспользованы повторно SELECT /* TEST 3.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 2; gets = 3 [INDEX RANGE SCAN] SELECT /* TEST 3.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 1; gets = 3 [INDEX RANGE SCAN] SELECT /* TEST 3.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 3 [INDEX RANGE SCAN] SELECT /* TEST 3.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 3 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 3.5 */ ID FROM TAB_TEST T WHERE ID < 40010; rows = 10009; gets = 41 [INDEX RANGE SCAN] ==================================================================================================== ==== Очищаем таблицу : truncate table TAB_TEST; ==== Вставляем 50000 записей : insert into TAB_TEST select rownum, 'test_' || rownum from dual connect by rownum <= 50000; ==== Удаляем 30000 записей в начале : delete TAB_TEST where id between 1 and 30000; --Читаются пустые блоки SELECT /* TEST 4.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 10001; gets = 250 [INDEX FAST FULL SCAN] SELECT /* TEST 4.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 43 [INDEX RANGE SCAN] SELECT /* TEST 4.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 85 [INDEX RANGE SCAN] SELECT /* TEST 4.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 1; gets = 44 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 4.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 9; gets = 123 [INDEX RANGE SCAN] ==== Вставляем 20000 записей в конец : insert into TAB_TEST select rownum + 70000, 'test_' || rownum from dual connect by rownum <= 20000; --Часть пустых блоков переиспользованы повторно SELECT /* TEST 5.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 10001; gets = 212 [INDEX FAST FULL SCAN] SELECT /* TEST 5.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 35 [INDEX RANGE SCAN] SELECT /* TEST 5.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 43 [INDEX RANGE SCAN] SELECT /* TEST 5.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 1; gets = 10 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 5.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 9; gets = 43 [INDEX RANGE SCAN] ==== Вставляем 20000 записей в конец : insert into TAB_TEST select rownum + 90000, 'test_' || rownum from dual connect by rownum <= 20000; --Пустые блоки переиспользованы повторно SELECT /* TEST 6.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 10001; gets = 282 [INDEX FAST FULL SCAN] SELECT /* TEST 6.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 2 [INDEX RANGE SCAN] SELECT /* TEST 6.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 1; gets = 2 [INDEX RANGE SCAN] SELECT /* TEST 6.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 1; gets = 2 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 6.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 9; gets = 2 [INDEX RANGE SCAN] ==================================================================================================== ==== Очищаем таблицу : truncate table TAB_TEST; ==== Вставляем 50000 записей : insert into TAB_TEST select rownum, 'test_' || rownum from dual connect by rownum <= 50000; ==== Удаляем все 50000 записей : delete TAB_TEST; --Читаются пустые блоки SELECT /* TEST 7.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 0; gets = 126 [INDEX RANGE SCAN] SELECT /* TEST 7.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 43 [INDEX RANGE SCAN] SELECT /* TEST 7.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 0; gets = 85 [INDEX RANGE SCAN] SELECT /* TEST 7.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 44 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 7.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 0; gets = 123 [INDEX RANGE SCAN] ==== Вставляем 20000 записей в конец : insert into TAB_TEST select rownum + 70000, 'test_' || rownum from dual connect by rownum <= 20000; --Часть пустых блоков переиспользованы повторно SELECT /* TEST 8.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 0; gets = 89 [INDEX RANGE SCAN] SELECT /* TEST 8.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 33 [INDEX RANGE SCAN] SELECT /* TEST 8.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 0; gets = 50 [INDEX RANGE SCAN] SELECT /* TEST 8.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 21 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 8.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 0; gets = 71 [INDEX RANGE SCAN] ==== Вставляем 30000 записей в конец : insert into TAB_TEST select rownum + 90000, 'test_' || rownum from dual connect by rownum <= 30000; --Пустые блоки переиспользованы повторно SELECT /* TEST 9.1 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 40001; rows = 0; gets = 2 [INDEX RANGE SCAN] SELECT /* TEST 9.2 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 20001; rows = 0; gets = 2 [INDEX RANGE SCAN] SELECT /* TEST 9.3 */ ID FROM TAB_TEST WHERE ID BETWEEN 10000 AND 30001; rows = 0; gets = 2 [INDEX RANGE SCAN] SELECT /* TEST 9.4 */ ID FROM TAB_TEST WHERE ID BETWEEN 20000 AND 30001; rows = 0; gets = 2 [INDEX RANGE SCAN] SELECT /*+ index(T IDX_TEST) TEST 9.5 */ ID FROM TAB_TEST T WHERE ID < 30010; rows = 0; gets = 2 [INDEX RANGE SCAN] И + еще накидал один дополнительно, тут вставляются в таблицу начальные 10000 значений, далее идут вставки в конец по 1000 и удаление сначала также по 1000 (500 итераций). Код: plsql 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. Результаты: 10. blocks=96 lf_blks=74 lf_rows=17123 br_blks=1 br_rows=73 del_lf_rows=7122 [ins_cnt=10000 del_cnt=9999] 20. blocks=96 lf_blks=87 lf_rows=19044 br_blks=1 br_rows=86 del_lf_rows=9043 [ins_cnt=10000 del_cnt=10000] 30. blocks=128 lf_blks=92 lf_rows=20526 br_blks=1 br_rows=91 del_lf_rows=10525 [ins_cnt=10000 del_cnt=10000] 40. blocks=128 lf_blks=92 lf_rows=20648 br_blks=1 br_rows=91 del_lf_rows=10647 [ins_cnt=10000 del_cnt=10000] 50. blocks=128 lf_blks=113 lf_rows=24436 br_blks=1 br_rows=112 del_lf_rows=14435 [ins_cnt=10000 del_cnt=10000] 60. blocks=128 lf_blks=114 lf_rows=24808 br_blks=1 br_rows=113 del_lf_rows=14807 [ins_cnt=10000 del_cnt=10000] 70. blocks=160 lf_blks=141 lf_rows=30302 br_blks=1 br_rows=140 del_lf_rows=20301 [ins_cnt=10000 del_cnt=10000] 80. blocks=160 lf_blks=147 lf_rows=30768 br_blks=1 br_rows=146 del_lf_rows=20767 [ins_cnt=10000 del_cnt=10000] 90. blocks=160 lf_blks=147 lf_rows=31610 br_blks=1 br_rows=146 del_lf_rows=21609 [ins_cnt=10000 del_cnt=10000] 100. blocks=192 lf_blks=148 lf_rows=32154 br_blks=1 br_rows=147 del_lf_rows=22153 [ins_cnt=10000 del_cnt=10000] 110. blocks=192 lf_blks=159 lf_rows=34021 br_blks=1 br_rows=158 del_lf_rows=24020 [ins_cnt=10000 del_cnt=10000] 120. blocks=192 lf_blks=177 lf_rows=37257 br_blks=1 br_rows=176 del_lf_rows=27256 [ins_cnt=10000 del_cnt=10000] 130. blocks=192 lf_blks=177 lf_rows=37554 br_blks=1 br_rows=176 del_lf_rows=27553 [ins_cnt=10000 del_cnt=10000] 140. blocks=192 lf_blks=177 lf_rows=37954 br_blks=1 br_rows=176 del_lf_rows=27953 [ins_cnt=10000 del_cnt=10000] 150. blocks=224 lf_blks=191 lf_rows=40871 br_blks=1 br_rows=190 del_lf_rows=30870 [ins_cnt=10000 del_cnt=10000] 160. blocks=224 lf_blks=205 lf_rows=43230 br_blks=1 br_rows=204 del_lf_rows=33229 [ins_cnt=10000 del_cnt=10000] 170. blocks=224 lf_blks=207 lf_rows=42956 br_blks=1 br_rows=206 del_lf_rows=32955 [ins_cnt=10000 del_cnt=10000] 180. blocks=224 lf_blks=207 lf_rows=42345 br_blks=1 br_rows=206 del_lf_rows=32344 [ins_cnt=10000 del_cnt=10000] 190. blocks=224 lf_blks=207 lf_rows=42732 br_blks=1 br_rows=206 del_lf_rows=32731 [ins_cnt=10000 del_cnt=10000] 200. blocks=256 lf_blks=208 lf_rows=43525 br_blks=1 br_rows=207 del_lf_rows=33524 [ins_cnt=10000 del_cnt=10000] 210. blocks=256 lf_blks=208 lf_rows=43168 br_blks=1 br_rows=207 del_lf_rows=33167 [ins_cnt=10000 del_cnt=10000] 220. blocks=256 lf_blks=208 lf_rows=43211 br_blks=1 br_rows=207 del_lf_rows=33210 [ins_cnt=10000 del_cnt=10000] 230. blocks=256 lf_blks=208 lf_rows=42597 br_blks=1 br_rows=207 del_lf_rows=32596 [ins_cnt=10000 del_cnt=10000] 240. blocks=256 lf_blks=208 lf_rows=42143 br_blks=1 br_rows=207 del_lf_rows=32142 [ins_cnt=10000 del_cnt=10000] 250. blocks=256 lf_blks=208 lf_rows=42607 br_blks=1 br_rows=207 del_lf_rows=32606 [ins_cnt=10000 del_cnt=10000] 260. blocks=256 lf_blks=208 lf_rows=43126 br_blks=1 br_rows=207 del_lf_rows=33125 [ins_cnt=10000 del_cnt=10000] 270. blocks=256 lf_blks=229 lf_rows=47697 br_blks=1 br_rows=228 del_lf_rows=37696 [ins_cnt=10000 del_cnt=10000] 280. blocks=256 lf_blks=238 lf_rows=49974 br_blks=1 br_rows=237 del_lf_rows=39973 [ins_cnt=10000 del_cnt=10000] 290. blocks=288 lf_blks=238 lf_rows=49170 br_blks=1 br_rows=237 del_lf_rows=39169 [ins_cnt=10000 del_cnt=10000] 300. blocks=288 lf_blks=238 lf_rows=48596 br_blks=1 br_rows=237 del_lf_rows=38595 [ins_cnt=10000 del_cnt=10000] 310. blocks=288 lf_blks=238 lf_rows=48443 br_blks=1 br_rows=237 del_lf_rows=38442 [ins_cnt=10000 del_cnt=10000] 320. blocks=288 lf_blks=242 lf_rows=48379 br_blks=1 br_rows=241 del_lf_rows=38378 [ins_cnt=10000 del_cnt=10000] 330. blocks=288 lf_blks=251 lf_rows=48937 br_blks=1 br_rows=250 del_lf_rows=38936 [ins_cnt=10000 del_cnt=10000] 340. blocks=288 lf_blks=252 lf_rows=49602 br_blks=1 br_rows=251 del_lf_rows=39601 [ins_cnt=10000 del_cnt=10000] 350. blocks=288 lf_blks=254 lf_rows=49987 br_blks=1 br_rows=253 del_lf_rows=39986 [ins_cnt=10000 del_cnt=10000] 360. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 370. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 380. blocks=288 lf_blks=262 lf_rows=52799 br_blks=1 br_rows=261 del_lf_rows=42798 [ins_cnt=10000 del_cnt=10000] 390. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 400. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 410. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 420. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 430. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 440. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 450. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 460. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 470. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 480. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 490. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] 500. blocks=288 lf_blks=262 lf_rows=52557 br_blks=1 br_rows=261 del_lf_rows=42556 [ins_cnt=10000 del_cnt=10000] Тут видно, что хотя размер и растет постоянно, но алгоритм переиспользования пустых блоков работает. Для сравнения, размер индекса без удаления записей (т.е. имуляция того, что пустые блоки остаются навсегда) - 2105 lf_blks. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 13:32 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39473697&tid=1884230]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 327ms |

| 0 / 0 |
