powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / create index online
11 сообщений из 11, страница 1 из 1
create index online
    #39958940
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Не могу найти и прояснить некоторые моменты создания индекса онлайн.

Индекс создается путем полного сканирования таблицы.
Как сессия получает данные dml других сессий, в это время меняющие столбцы, задействованные в индексе, через redo?

После создания структуры индекса, сессия ddl ожидает окончания текущих транзакций на таблице.
При этом новые транзакции не блокируются. Каков механизм этого?
Данный индекс становится виден новым сессиям и они могут править его сами?
Или данные изменений сливаются в какой-то буфер и сессия dml после получения управления донакатывает их сама, после чего актуализирует индекс в словаре?
...
Рейтинг: 0 / 0
create index online
    #39958957
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создается mview log, далее стандартно, как redefinition.
...
Рейтинг: 0 / 0
create index online
    #39958979
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Так в redefinition при finish_redit_table все dml блокируются.
А при инициализации индекса новые dml продолжают идти.
...
Рейтинг: 0 / 0
create index online
    #39958986
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
finish - это последний этап, достаточно короткий.
...
Рейтинг: 0 / 0
create index online
    #39958993
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
finish - это последний этап, достаточно короткий.

Инициализация индекса это тоже последний и очень короткий этап.
Вопрос в том, почему при нем ожидается окончания транзакций на таблице на момент начала данного шага и не блокируются последующие.
...
Рейтинг: 0 / 0
create index online
    #39959000
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swsov
не блокируются последующие.

Откуда взяли?
...
Рейтинг: 0 / 0
create index online
    #39959010
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Swsov
не блокируются последующие.

Откуда взяли?


Да ладно )
Мне действительно кейс сделать?
Но вообще-то этот момент еще с 11 версии идет.
...
Рейтинг: 0 / 0
create index online
    #39959024
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> select * from v$version
  2  /

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0
PL/SQL Release 12.2.0.1.0 - Production                                                    0
CORE  12.2.0.1.0  Production                                                               0
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production                                   0
NLSRTL Version 12.2.0.1.0 - Production                                                    0
 
SQL> create table TEST_CREATE_INDEX as select rownum id, rownum f, 'name' || rownum name from dual connect by rownum < 3000000;

Table created

SQL> create index IDX_TEST_CREATE_INDEX_ID on TEST_CREATE_INDEX(ID);

Index created

SQL>


И сам процесс в 3 сессиях
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
--1 session
update TEST_CREATE_INDEX set name = 'id=1' where id = 1;

--2 session
create index IDX_TEST_CREATE_INDEX_F on TEST_CREATE_INDEX(F) online;
...enq: TX - row lock contention

--1 session
commit;
update TEST_CREATE_INDEX set name = 'id=2' where id = 1;

--2 session
...direct reads...структура индекса готова...enq: TX - row lock contention

--3 session
update TEST_CREATE_INDEX set name = 'id=3' where id = 3;
commit;
/*транзакция успешно прошла, блокировка все еще висит*/

--1 session - снимаем блок
commit;

--2 session - индекс готов
...
Рейтинг: 0 / 0
create index online
    #39959047
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swsov
Код: plsql
1.
SQL> select * from v$version


Ну и где здесь финализация индекса?
Скажу по секрету: Вы можете до морковкина заговения по очереди проводить update-commit по сессиям 1 и 3, пока обе не будут зафиксированы - индекс финализирован не будет.
...
Рейтинг: 0 / 0
create index online
    #39959110
Swsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous

Ну и где здесь финализация индекса?
Скажу по секрету: Вы можете до морковкина заговения по очереди проводить update-commit по сессиям 1 и 3, пока обе не будут зафиксированы - индекс финализирован не будет.

Ну как бы нет, еще одна транзакция и ...
Код: 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.
--1 session
update TEST_CREATE_INDEX set name = 'id=1' where id = 1;

--2 session
create index IDX_TEST_CREATE_INDEX_F on TEST_CREATE_INDEX(F) online;
...enq: TX - row lock contention

--1 session
commit;
update TEST_CREATE_INDEX set name = 'id=2' where id = 1;

--2 session
...direct reads...структура индекса готова...enq: TX - row lock contention

--3 session
update TEST_CREATE_INDEX set name = 'id=3' where id = 3;

--1 session - снимаем блок, индекс не финализируется
commit;

--4 session - еще одна блокировка
update TEST_CREATE_INDEX set name = 'id=4' where id = 4;

--3 session - снимаем блок и индекс прописывается, несмотря на активную транзакцию
commit;

--2 session - индекс готов

--4 session
commit;



Вопрос все тот же, что за механизм позволяет активировать индекс с активными транзакциями на таблице.
...
Рейтинг: 0 / 0
create index online
    #39959711
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коротко, по памяти, без вдавания в детали.

Для примера возьмем транзакции, меняющие данные только в исходной таблице.
Для индекса с опцией online, который хочет финализироваться, будет 3 набора транзакций:
- 1 набор : транзакции, существующие на момент финализации
- 2 набор : транзакции, стартующие между началом финализации и моментом окончания всех транзакций из 1 набора
- 3 набор : транзакции, стартующие после окончания всех транзакций из 1 набора

Сессия, создающая индекс и блокированная на стадии его актуализации будет ждать окончания всех транзакция 1 и 2 набора.
Поэтому даже постоянно обновляемая таблица позволит создать индекс online.

ЗЫ. Не скажу насчет 11G, так как в то время уже гоняли на 12 версии.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / create index online
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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