powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про распухание индексов
5 сообщений из 5, страница 1 из 1
Вопрос про распухание индексов
    #40141786
Andrey52691
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос: как можно найти распухшие индексы?

Я сделал следующий эксперимент - я создал таблицу, состоящую из двух колонок - числовой id и строковое поле varchar2(100), создал обычный индекс по строковому полю и вставил в эту таблицу 1 млн. строк,использовав dbms_random для создания случайных строк. После этого я замерил размер индекса - 109 Мб. После этого я делал обновление этого строкового столбца - всех значений этого слобца на новые случайные значения, порождаемые dbms_random. Каждое такое обновление приводило к увеличению размера индекса - сначала до 117 Мб, потом - до 125Мб. После этого я сделал циклическое обновление этого строкового поля, то есть, когда значение этого текстового поля для id=1 присваивалось значению для id=2 и т.д., а первое менялось местом с последним. Одно такое обновление привело к росту размера индекса до 218 Мб.

При этом я смотрел на параметры, которые мне предложил ИИ - соотношение leaf_block к num_rows, clustering_factor, отношение clustering_factor к num_rows и отношение размера индекса к leaf_block, умноженному на размер блока. Изменение этих параметров было очень незначительным.

В принципе, определять распухшие индексы можно так.
1. Нужно создать таблицу с точно такой же структурой полей, как исходная таблица.
2. Создать те же самые индексы, как в исходной таблице.
3. Поместить в эту пустую таблицу данные из исходной с помощью конструкции insert into .. select ..
4. Посмотреть размеры индексов в скопированной таблице и сравнить их с размерами индексов в исходной таблице - значительное превышение размеров индексов исходной таблицы покажет распухшие индексы.

Недостатком этого метода является длительность копирования больших таблиц и необходимость выделения большого количества дискового пространства под большие таблицы и их индексы. И это фатальный недостаток, делающий этот метод непригодным для больших таблиц.

Поэтому хотелось бы узнать, коллеги, как вы определяете наличие распухших индексов.
...
Рейтинг: 0 / 0
Вопрос про распухание индексов
    #40141788
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey52691 [игнорируется] 
Andrey52691  16.10.2025, 14:05
[игнорируется]
Поэтому хотелось бы узнать, коллеги, как вы определяете наличие распухших индексов.
Никак, ибо перестроение не нужно в подавляющем большинстве случаев:Есть частные случаи, вроде массовых DML. Но в этом случае может быть эффективнее перевести индекс в UNUSABLE и перестроить после.
Для большинства случаев, когда делается INDEX REBUILD, т.е. для любителей рукоблудия, бездельников и всех, страдающих compulsive tuning disorder, может хватить EXPLAIN PLAN/DBMS_SPACE.CREATE_INDEX_COST, чем использование описанной процедуры в начальном комментарии (см. estimated index size в выводе ниже).
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> explain plan for create index xyz on t(vc);

Explained.

SQL> select * from dbms_xplan.display();

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 518119102

-------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | CREATE INDEX STATEMENT |      |   100K|  9863K|   681   (1)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| XYZ  |       |       |            |          |
|   2 |   SORT CREATE INDEX    |      |   100K|  9863K|            |          |
|   3 |    TABLE ACCESS FULL   | T    |   100K|  9863K|   410   (1)| 00:00:01 |
-------------------------------------------------------------------------------

Note
-----
   - estimated index size: 13M bytes
...
Рейтинг: 0 / 0
Вопрос про распухание индексов
    #40141789
Andrey52691
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я нашёл, как определить распухшие индексы - по информации из index_stats. Соотношение полей del_lf_rows и lf_rows показывает процент разбухания.
...
Рейтинг: 0 / 0
Вопрос про распухание индексов
    #40141790
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey52691  17.10.2025, 07:07
[игнорируется]
А я нашёл, как определить распухшие индексы - по информации из index_stats. Соотношение полей del_lf_rows и lf_rows показывает процент разбухания.
del_lf_rows есть по первой ссылке (asktom) и обсуждается во второй (Richard Foote), с подробными пояснениями процент чего он точно показывает.
...
Рейтинг: 0 / 0
Вопрос про распухание индексов
    #40141806
DMaslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
---- как можно найти распухшие индексы?

Бывают еще и распухшие таблицы, и распухший чл.... журнал TNSListener.

Если вы учитесь/работаете с БД в целом и с СУБД Oracle в частности больше полугода, рекомендую перейти от тестовых заданий к реальным БД.

Там будет понятно, что действовать надо на уровне админа, а именно DBA_SEGMENTS, DBA_DATA_FILES, DBA_FREE_SPACE и т.п.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос про распухание индексов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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