Как установить для переменной сеанса skip_unusable_indexes значение true в пакете PL / SQL, чтобы ускорить удаление / вставку таблицы? - PullRequest
3 голосов
/ 09 октября 2008

Я пытаюсь ускорить загрузку данных, которая контролируется с помощью хранимой процедуры PL / SQL. Я программно изменил индексы для таблицы, которую я хочу обновить, чтобы она не использовалась. Я хочу, чтобы Oracle игнорировал эти непригодные для использования индексы. Я могу выдать заявление:

ALTER SESSION SET skip_unusable_indexes = TRUE

но впоследствии я получаю ошибку:

ORA-01502: индекс 'MY_INDEX_NAME' или раздел такого индекса находится в непригодное состояние

похоже, что он проигнорировал мой сеанс изменения.

Могу ли я изменить свой сеанс внутри пакета PL / SQL? Если нет, то какова моя альтернатива? Как еще можно отключить (установить неиспользуемые) индексы для ускорения загрузки?

Несколько связанный вопрос здесь .

1 Ответ

4 голосов
/ 09 октября 2008

Вы выполняете инструкцию ALTER SESSION в том же сеансе, который использует хранимая процедура? Или это ALTER SESSION выполняется в отдельном сеансе?

Вы можете встроить ALTER SESSION в PL / SQL с помощью динамического SQL, т.е.

BEGIN
  EXECUTE IMMEDIATE 'ALTER SESSION SET skip_unusable_indexes = TRUE';

  <<more code>>
END;

Являются ли некоторые индексы уникальными (или используются для принудительного применения уникального ограничения)? В документации skip_unusable_indexes указано

Примечание. Если индекс используется для принудительного УНИКАЛЬНОЕ ограничение на стол, то разрешение операций вставки и обновления на столе может нарушить ограничение. Поэтому этот параметр не отключает отчеты об ошибках для непригодные индексы, которые являются уникальными.

Если это так, можете ли вы отключить ограничение и / или изменить индекс (ы) на неуникальные?

Быстрый образец различия между уникальными и неуникальными индексами. Обратите внимание, что если у вас есть неиспользуемый уникальный индекс, skip_unusable_indexes не подавляет ошибку ORA-01502, как при использовании неиспользуемого неуникального индекса.

SQL> create table a (
  2    col1 number
  3  );

Table created.

SQL> create unique index idx_a on a( col1 );

Index created.

SQL> insert into a values( 1 );

1 row created.

SQL> commit;

Commit complete.

SQL> alter index idx_a unusable;

Index altered.

SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state


SQL> alter session set skip_unusable_indexes = true;

Session altered.

SQL> insert into a values( 2 );
insert into a values( 2 )
*
ERROR at line 1:
ORA-01502: index 'SCOTT.IDX_A' or partition of such index is in unusable state


SQL> drop index idx_a;

Index dropped.

SQL> create index idx_a_nonunique on a( col1 );

Index created.

SQL> alter index idx_a_nonunique unusable;

Index altered.

SQL> insert into a values( 2 );

1 row created.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...