|
|
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Oracle Database 10g Release 10.2.0.4.0 Имеется таблица Код: plsql 1. 2. В таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей. При выполнении запроса вида Код: plsql 1. периодически (не всегда!) читаются почти все блоки из сегмента индекса, т.е. не только те 10 тыс, что указаны в all_indexes.leaf_blocks, но и остальные 90 тыс из сегмента индекса. Хотя если использовать запрос с закрытой левой границей (almost_sysdate -1/24 < dt < almost_sysdate), то ничего лишнего не читается. Причём, индекс периодически, раз в несколько дней, переключается из режима чтения "лишних" блоков в режим чтения только блоков с данными, а потом переключается обратно. Вопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 13:41 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Нет, это ненормально И очень похоже, что таки где-то вставляется запись с нулевой (отрицательной, до н.э.) датой, что оставляет все промежуточные блоки в цепочке Можно попробовать повесить констрейнт, типа дата не меньше чем год/месяц/день назад Можно, конечно, грешить на баг, но 10.2.0.4 достаточно стабильная и описанная ситуация (добавление новых, подтирка старых) достаточно стандартная -- уже кто-нибудь наступил бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 15:18 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНет, это ненормально И очень похоже, что таки где-то вставляется запись с нулевой (отрицательной, до н.э.) датой, что оставляет все промежуточные блоки в цепочке Да бог с тобой =) Запись с маленькой датой оставит только блок в котором она есть, остальные блоки, в которых находятся только удаленные записи, будут переиспользованы по возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:10 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Сейчас точно не найду, но как-то проскакивала информация, что "в целях оптимизации" пустой блок становится недоступен через ссылочку из branch-блока, но цепочка "лево-право" не прерывается в листовых блоках, пока есть значение в конце цепочки. Только при переиспользовании этих пустых блоков указатели "лево-право" перезаписываются в смежные листовые блоки. Вроде, как связано было с возможностью flashback по undo. Врать уже больше не буду , но с определенной версии пришлось запускать ежесуточную перестройку индексов для приложения работающего в таком режиме "очереди" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:33 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Ну так алгоритм ТС будет постоянно переиспользовать пустые блоки NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. Так что записи в самом начале делу не помеха. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 16:45 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
У нас затыкалась именно такая же технология -- "очередь", где накладывается в один конец, а вычищается (обрабатывается) с другого Только там была не дата, а ID из последовательности Вот когда обработка некоторых ID затыкалась -- их делали отрицательными (типа, разберемся потом) И начинались тормоза, которые лечились ежесуточным перестроением индекса Естественно, если ничего не трогать (не обновлять ID в отрицательное значение), то ничего и не тормозило, все красиво отрезалось и MIN/MAX не пробегал сотню пустых блоков Вот точно не скажу, вроде как действительно началось именно в 10.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:04 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Т.е. при каких-то условиях, индексные блоки с удаленными записями не использовались повторно в массовых количествах? Весьма интересно. Можешь пример представить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:10 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKпериодически (не всегда!) читаются почти все блоки из сегмента индекса а как читаются? range scan? fast full scan? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:15 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Вячеслав Любомудров, Т.е. при каких-то условиях, индексные блоки с удаленными записями не использовались повторно в массовых количествах? Весьма интересно. Можешь пример представить?Они использовались И именно тогда цепочка укорачивалась Но не так быстро, как хотелось бы Пример так быстро не предоставлю, в отпуске, пишу по памяти 2DBA Насколько помню, именно RS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:20 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKВопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?да, скорее всего, у вас просто план плавает с фулскана на rs и обратно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:30 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
DВАNLKпериодически (не всегда!) читаются почти все блоки из сегмента индекса а как читаются? range scan? fast full scan? dbms_xplan.display_cursor показывает INDEX RANGE SCAN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:44 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
xtenderNLKВопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?да, скорее всего, у вас просто план плавает с фулскана на rs и обратно Но dbms_xplan.display_cursor ни разу не показывал фулсканы: в обоих "режимах" работы индекса показывает index range scan, только Buffers и Reads скачут на порядок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:47 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLK, analyze index idx_tab_dt validate structure select * from index_stats ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:50 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKолько Buffers и Reads скачут на порядок.так а ожидания-то проверили? может не индекс-то читается, а просто совпадает с удалениями вашими постоянными ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 17:51 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
AlexFF__|NLK, analyze index idx_tab_dt validate structure select * from index_stats Это ведь блокирующая операция. На боевой БД не дадут это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:15 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
xtenderNLKолько Buffers и Reads скачут на порядок.так а ожидания-то проверили? может не индекс-то читается, а просто совпадает с удалениями вашими постоянными Прошу прощения, я видимо что-то не понял. Имеете в виду, что другой объект (таблица, а не индекс) читается? Или dbms_xplan.display_cursor показывает чтения и для других запросов, выполнявшихся одновременно с проблемным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:19 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLK, я про undo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:24 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLK, ну и возможная отложенная очистка блоков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 18:25 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Да скорее всего, все проще NLKАналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей. В индексе из примерно 100к блоков (не будем считать дерево) не пустые только 10к, они и показаны в статистике как leaf_blocks. IRS (dt < almost_sysdate) в таком случае читает все пустые блоки в начале, (almost_sysdate -1/24 < dt < almost_sysdate) читает только нужный диапазон, выключая некоторые пустые блоки, по удаленным записям тоже определяются границы. Только записи в данном случае должны писаться мощными блоками раз некоторое время =) Или, как писал Вячеслав Любомудров, это какой-то баг при котором сводные блоки не используются повторно некоторое время. В любом случае, как ты и сам писал, левая граница поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 20:22 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
И все-таки для начала я бы зафиксировал план с IRS для надёжности... Затем отребилдил бы индекс, т.к. похоже что сегмент такой большой, потому что изначально не было удаления по расписанию. И только потом, если проблема осталась решал бы её по детальным данным с ожиданиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 22:30 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
Вот навскидку описание изVarious Aspects of Fragmentation (Doc ID 186826.1) Код: plaintext 1. 2. 3. 4. 5. 6. Естественно, если условие будет на ключ (например, дата > sysdate-1), а не просто Код: plsql 1. то начальное (MIN/MAX) значение (та самая нулевая дата) и все пустые блоке в цепочке до действительно нужной даты будут пропущены PS. Правда, если у автора действительно NLKВсе записи, старше нескольких часов удаляются ежеминутното это не та причина. Но это же sql.ru -- читаешь об одном, а отвечаешь про наболевшее Да и есть подозрение, что удаляются только "обработанные" записи, а не скопом DELETE ... WHERE дата < sysdate-6/24 PPS. Тестик надо будет все-таки сделать, самому интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 04:33 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKAlexFF__|NLK, analyze index idx_tab_dt validate structure select * from index_stats Это ведь блокирующая операция. На боевой БД не дадут это сделать.Если есть доступ, можно посмотреть Script to investigate a b-tree index structure (Doc ID 989186.1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 04:43 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей. При выполнении запроса вида Код: plsql 1. периодически (не всегда!) читаются почти все блоки из сегмента индекса, т.е. не только те 10 тыс, что указаны в all_indexes.leaf_blocks, но и остальные 90 тыс из сегмента индекса. Хотя если использовать запрос с закрытой левой границей (almost_sysdate -1/24 < dt < almost_sysdate), то ничего лишнего не читается. Причём, индекс периодически, раз в несколько дней, переключается из режима чтения "лишних" блоков в режим чтения только блоков с данными, а потом переключается обратно. Вопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит? Предполагаю, что переключение в режим чтения только блоков с данными происходит после (автоматического) пересбора статистики по этой таблице. По мере того, как статистика (интервал , в котором на тот момент были значения dt) перестает соответствовать попаданию в этот интервал almost_sysdate, план портится. xtenderда, скорее всего, у вас просто план плавает с фулскана на rs и обратно +1 Наверное, зафиксировать план, как xtender предложил, будет наиболее разумно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 14:20 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.В индексе, в котором данные монотонно сдвигаются "вправо", "левые" высвобождающиеся блоки повторно не используются, поскольку автоматический coalesce происходит только при попытке вставить околоудалённый ключ, чего в монотонно подчищающейся последовательности не происходит. Как следствие RS слева (даже min) катастрофически неэффективен. Выход несложный: после какого-то очередного массового delete надо делать индексу ничего не блокирующий coalesce. Вячеслав ЛюбомудровИ начинались тормоза, которые лечились ежесуточным перестроением индексаСерпом по яйцам не разбираясь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 15:43 |
|
||
|
RS с левой открытой границей читает пустые блоки индекса
|
|||
|---|---|---|---|
|
#18+
ElicNLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.В индексе, в котором данные монотонно сдвигаются "вправо", "левые" высвобождающиеся блоки повторно не используются, поскольку автоматический coalesce происходит только при попытке вставить околоудалённый ключ, чего в монотонно подчищающейся последовательности не происходит. Как следствие RS слева (даже min) катастрофически неэффективен.Это не совсем так Они переиспользуются, когда до них доходит очередь (а алгоритм там не совсем очевидный) -- сразу после того как [листовой] блок становится полностью пустым, он попадает в список свободных блоков, но из цепочки (лист <-> лист) не удаляется (до переиспользования) Т.е. пустые блоки посещаются только при движении по листовым ссылкам Более того, если у тебя в левом конце нет актуального значения, то в этот левый конец никак не попадешь (через путешествие по root->[branch->]...leaf) Соответственно, обычное "скользящее" окно, если оно небольшое, работает достаточно предсказуемо ElicВыход несложный: после какого-то очередного массового delete надо делать индексу ничего не блокирующий coalesce.Здесь нет "массового" удаления, здесь оно непрерывное Очередь ElicВячеслав ЛюбомудровИ начинались тормоза, которые лечились ежесуточным перестроением индексаСерпом по яйцам не разбираясь?В ранних версиях 10-ки, насколько помню с COALESCE был достаточно страшный баг, когда при его прерывании (на индексе ) можно было потерять данные таблицы . Да и кто юзает новые фичи сразу По поводу перестроения тоже свои тараканы -- до 11 нельзя было указать таймаут DDL (а может это и хорошо было), а потом еще какие-то фишки с ONLINE вылезли Когда это все работает асинхронно, в несколько потоков (как наваливающих, так и разгребающих) со своими связанными таблицами... В общем, как правило, работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2017, 16:03 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39473610&tid=1884230]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 343ms |

| 0 / 0 |
