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

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

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

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

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

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

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


Да ладно )
Мне действительно кейс сделать?
Но вообще-то этот момент еще с 11 версии идет.
...
Рейтинг: 0 / 0
18.05.2020, 16:39
    #39959024
Swsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create index online
Код: 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
18.05.2020, 17:45
    #39959047
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create index online
Swsov
Код: plsql
1.
SQL> select * from v$version


Ну и где здесь финализация индекса?
Скажу по секрету: Вы можете до морковкина заговения по очереди проводить update-commit по сессиям 1 и 3, пока обе не будут зафиксированы - индекс финализирован не будет.
...
Рейтинг: 0 / 0
18.05.2020, 20:27
    #39959110
Swsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create index online
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
19.05.2020, 23:18
    #39959711
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
create index online
Коротко, по памяти, без вдавания в детали.

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

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

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


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