Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RS с левой открытой границей читает пустые блоки индекса / 25 сообщений из 52, страница 1 из 3
15.06.2017, 13:41
    #39472256
NLK
NLK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
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
15.06.2017, 15:18
    #39472363
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
Нет, это ненормально
И очень похоже, что таки где-то вставляется запись с нулевой (отрицательной, до н.э.) датой, что оставляет все промежуточные блоки в цепочке
Можно попробовать повесить констрейнт, типа дата не меньше чем год/месяц/день назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ну и возможная отложенная очистка блоков
...
Рейтинг: 0 / 0
15.06.2017, 20:22
    #39472674
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
Да скорее всего, все проще
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
15.06.2017, 22:30
    #39472707
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
И все-таки для начала я бы зафиксировал план с IRS для надёжности...
Затем отребилдил бы индекс, т.к. похоже что сегмент такой большой, потому что изначально не было удаления по расписанию.
И только потом, если проблема осталась решал бы её по детальным данным с ожиданиями.
...
Рейтинг: 0 / 0
16.06.2017, 04:33
    #39472757
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
Вот навскидку описание из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
16.06.2017, 04:43
    #39472758
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
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
17.06.2017, 14:20
    #39473592
Nobody1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
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
17.06.2017, 15:43
    #39473610
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
NLKВ таблицу с постоянной скоростью пишутся данные, в dt записывается текущая дата-время. Все записи, старше нескольких часов удаляются ежеминутно. То есть, в таблице не очень много данных, но довольно много блоков (на порядок больше, чем необходимо, чтобы эти данные сохранить), и данные расположены всюду неплотно. Аналогичная ситуация с индексом: листовых блоков (по all_indexes.leaf_blocks) около 10 тыс, что почти в 10 раз меньше, чем блоков в сегменте индекса (100 тыс), и в каждом живом блоке в среднем по 10 записей.В индексе, в котором данные монотонно сдвигаются "вправо", "левые" высвобождающиеся блоки повторно не используются, поскольку автоматический coalesce происходит только при попытке вставить околоудалённый ключ, чего в монотонно подчищающейся последовательности не происходит.
Как следствие RS слева (даже min) катастрофически неэффективен.
Выход несложный: после какого-то очередного массового delete надо делать индексу ничего не блокирующий coalesce.
Вячеслав ЛюбомудровИ начинались тормоза, которые лечились ежесуточным перестроением индексаСерпом по яйцам не разбираясь?
...
Рейтинг: 0 / 0
17.06.2017, 16:03
    #39473615
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RS с левой открытой границей читает пустые блоки индекса
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RS с левой открытой границей читает пустые блоки индекса / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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