powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RS с левой открытой границей читает пустые блоки индекса
25 сообщений из 52, страница 1 из 3
RS с левой открытой границей читает пустые блоки индекса
    #39472256
NLK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLK
Гость
Oracle Database 10g Release 10.2.0.4.0

Имеется таблица
Код: plsql
1.
2.
create table tab(...., dt date, ...);
create index idx_tab_dt on tab(dt);


В таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.

При выполнении запроса вида
Код: plsql
1.
select * from tab where dt < almost_sysdate


периодически (не всегда!) читаются почти все блоки из сегмента индекса, т.е. не только те 10 тыс, что указаны в all_indexes.leaf_blocks, но и остальные 90 тыс из сегмента индекса. Хотя если использовать запрос с закрытой левой границей (almost_sysdate -1/24 < dt < almost_sysdate), то ничего лишнего не читается. Причём, индекс периодически, раз в несколько дней, переключается из режима чтения "лишних" блоков в режим чтения только блоков с данными, а потом переключается обратно.

Вопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472363
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, это ненормально
И очень похоже, что таки где-то вставляется запись с нулевой (отрицательной, до н.э.) датой, что оставляет все промежуточные блоки в цепочке
Можно попробовать повесить констрейнт, типа дата не меньше чем год/месяц/день назад

Можно, конечно, грешить на баг, но 10.2.0.4 достаточно стабильная и описанная ситуация (добавление новых, подтирка старых) достаточно стандартная -- уже кто-нибудь наступил бы
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472441
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНет, это ненормально
И очень похоже, что таки где-то вставляется запись с нулевой (отрицательной, до н.э.) датой, что оставляет все промежуточные блоки в цепочке
Да бог с тобой =)
Запись с маленькой датой оставит только блок в котором она есть, остальные блоки, в которых находятся только удаленные записи, будут переиспользованы по возможности.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472466
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас точно не найду, но как-то проскакивала информация, что "в целях оптимизации" пустой блок становится недоступен через ссылочку из branch-блока, но цепочка "лево-право" не прерывается в листовых блоках, пока есть значение в конце цепочки. Только при переиспользовании этих пустых блоков указатели "лево-право" перезаписываются в смежные листовые блоки.
Вроде, как связано было с возможностью flashback по undo.
Врать уже больше не буду , но с определенной версии пришлось запускать ежесуточную перестройку индексов для приложения работающего в таком режиме "очереди"
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472475
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Ну так алгоритм ТС будет постоянно переиспользовать пустые блоки
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно.
Так что записи в самом начале делу не помеха.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472507
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас затыкалась именно такая же технология -- "очередь", где накладывается в один конец, а вычищается (обрабатывается) с другого
Только там была не дата, а ID из последовательности
Вот когда обработка некоторых ID затыкалась -- их делали отрицательными (типа, разберемся потом)
И начинались тормоза, которые лечились ежесуточным перестроением индекса

Естественно, если ничего не трогать (не обновлять ID в отрицательное значение), то ничего и не тормозило, все красиво отрезалось и MIN/MAX не пробегал сотню пустых блоков

Вот точно не скажу, вроде как действительно началось именно в 10.2
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472515
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Т.е. при каких-то условиях, индексные блоки с удаленными записями не использовались повторно в массовых количествах?
Весьма интересно.
Можешь пример представить?
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472524
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NLKпериодически (не всегда!) читаются почти все блоки из сегмента индекса

а как читаются?
range scan?
fast full scan?
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472530
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|Вячеслав Любомудров,

Т.е. при каких-то условиях, индексные блоки с удаленными записями не использовались повторно в массовых количествах?
Весьма интересно.
Можешь пример представить?Они использовались
И именно тогда цепочка укорачивалась
Но не так быстро, как хотелось бы

Пример так быстро не предоставлю, в отпуске, пишу по памяти

2DBA
Насколько помню, именно RS
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472539
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NLKВопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?да, скорее всего, у вас просто план плавает с фулскана на rs и обратно
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472561
NLK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLK
Гость
DВАNLKпериодически (не всегда!) читаются почти все блоки из сегмента индекса

а как читаются?
range scan?
fast full scan?

dbms_xplan.display_cursor показывает INDEX RANGE SCAN.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472566
NLK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLK
Гость
xtenderNLKВопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?да, скорее всего, у вас просто план плавает с фулскана на rs и обратно
Но dbms_xplan.display_cursor ни разу не показывал фулсканы: в обоих "режимах" работы индекса показывает index range scan, только Buffers и Reads скачут на порядок.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472569
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NLK,

analyze index idx_tab_dt validate structure
select * from index_stats
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472573
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NLKолько Buffers и Reads скачут на порядок.так а ожидания-то проверили? может не индекс-то читается, а просто совпадает с удалениями вашими постоянными
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472606
NLK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLK
Гость
AlexFF__|NLK,

analyze index idx_tab_dt validate structure
select * from index_stats
Это ведь блокирующая операция. На боевой БД не дадут это сделать.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472612
NLK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLK
Гость
xtenderNLKолько Buffers и Reads скачут на порядок.так а ожидания-то проверили? может не индекс-то читается, а просто совпадает с удалениями вашими постоянными
Прошу прощения, я видимо что-то не понял. Имеете в виду, что другой объект (таблица, а не индекс) читается? Или dbms_xplan.display_cursor показывает чтения и для других запросов, выполнявшихся одновременно с проблемным?
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472616
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NLK,

я про undo
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472618
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NLK,

ну и возможная отложенная очистка блоков
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472674
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да скорее всего, все проще
NLKАналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.
В индексе из примерно 100к блоков (не будем считать дерево) не пустые только 10к, они и показаны в статистике как leaf_blocks.
IRS (dt < almost_sysdate) в таком случае читает все пустые блоки в начале, (almost_sysdate -1/24 < dt < almost_sysdate) читает только нужный диапазон, выключая некоторые пустые блоки, по удаленным записям тоже определяются границы.
Только записи в данном случае должны писаться мощными блоками раз некоторое время =)
Или, как писал Вячеслав Любомудров, это какой-то баг при котором сводные блоки не используются повторно некоторое время.
В любом случае, как ты и сам писал, левая граница поможет.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472707
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И все-таки для начала я бы зафиксировал план с IRS для надёжности...
Затем отребилдил бы индекс, т.к. похоже что сегмент такой большой, потому что изначально не было удаления по расписанию.
И только потом, если проблема осталась решал бы её по детальным данным с ожиданиями.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472757
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот навскидку описание изVarious Aspects of Fragmentation (Doc ID 186826.1)
Код: plaintext
1.
2.
3.
4.
5.
6.
4.  Fragmentation within B*Tree Segments
----------------------------------------
B*Trees get fragmented due to repeated DML operations.
...
4.2. On deletes,  if a leaf block becomes empty , it is put on the list of free 
     blocks.  It is not removed from the tree at this point  for performance
     reasons as this block might have a key inserted into it soon.
Т.е. пока блок не будет переиспользован, он так и останется в цепочке листовых блоков и при просмотре индекса (RANGE / FULL INDEX SCAN) будет читаться.
Естественно, если условие будет на ключ (например, дата > sysdate-1), а не просто
Код: plsql
1.
select * from (select /*+ index */ ... from table order by дата) where rownum <= 10

то начальное (MIN/MAX) значение (та самая нулевая дата) и все пустые блоке в цепочке до действительно нужной даты будут пропущены

PS. Правда, если у автора действительно NLKВсе записи, старше нескольких часов удаляются ежеминутното это не та причина.
Но это же sql.ru -- читаешь об одном, а отвечаешь про наболевшее
Да и есть подозрение, что удаляются только "обработанные" записи, а не скопом DELETE ... WHERE дата < sysdate-6/24

PPS. Тестик надо будет все-таки сделать, самому интересно
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39472758
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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)
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39473592
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.

При выполнении запроса вида
Код: plsql
1.
select * from tab where dt < almost_sysdate


периодически (не всегда!) читаются почти все блоки из сегмента индекса, т.е. не только те 10 тыс, что указаны в all_indexes.leaf_blocks, но и остальные 90 тыс из сегмента индекса. Хотя если использовать запрос с закрытой левой границей (almost_sysdate -1/24 < dt < almost_sysdate), то ничего лишнего не читается. Причём, индекс периодически, раз в несколько дней, переключается из режима чтения "лишних" блоков в режим чтения только блоков с данными, а потом переключается обратно.

Вопрос: периодическое чтение пустых блоков - это нормальная ситуация? Почему так происходит?
Предполагаю, что переключение в режим чтения только блоков с данными происходит после (автоматического) пересбора статистики по этой таблице. По мере того, как статистика (интервал , в котором на тот момент были значения dt) перестает соответствовать попаданию в этот интервал almost_sysdate, план портится.

xtenderда, скорее всего, у вас просто план плавает с фулскана на rs и обратно
+1

Наверное, зафиксировать план, как xtender предложил, будет наиболее разумно.
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39473610
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.В индексе, в котором данные монотонно сдвигаются "вправо", "левые" высвобождающиеся блоки повторно не используются, поскольку автоматический coalesce происходит только при попытке вставить околоудалённый ключ, чего в монотонно подчищающейся последовательности не происходит.
Как следствие RS слева (даже min) катастрофически неэффективен.
Выход несложный: после какого-то очередного массового delete надо делать индексу ничего не блокирующий coalesce.
Вячеслав ЛюбомудровИ начинались тормоза, которые лечились ежесуточным перестроением индексаСерпом по яйцам не разбираясь?
...
Рейтинг: 0 / 0
RS с левой открытой границей читает пустые блоки индекса
    #39473615
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 вылезли
Когда это все работает асинхронно, в несколько потоков (как наваливающих, так и разгребающих) со своими связанными таблицами... В общем, как правило, работает
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RS с левой открытой границей читает пустые блоки индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]