Отключите и позже включите все индексы таблицы в Oracle

Давайте сделаем педантичный, потому что есть различия, которые могут действительно повлиять на поведение вашего кода. Из комментариев, сделанных к статье «Old New Thing» , взята большая часть из следующих соображений.

Иногда память, возвращаемая новым оператором, будет инициализирована, а иногда она не будет в зависимости от того, является ли тип, который вы новичок, представляет собой POD (простые старые данные) , или если это класс, который содержит элементы POD и использует созданный компилятором конструктор по умолчанию.

  • В C ++ 1998 существует 2 типа инициализации: нуль и значение по умолчанию
  • В C ++ 2003 добавлена ​​инициализация 3-го типа, инициализация значения.

Предположим:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

В компиляторе C ++ 98 должно произойти следующее:

  • new A - неопределенное значение
  • new A() - zero-initialize
  • new B - конструктор по умолчанию (B :: m не инициализирован)
  • new B() - конструкция по умолчанию (B :: m неинициализирована )
  • new C - конструкция по умолчанию (C :: m инициализируется нулем)
  • new C() - конструкция по умолчанию (C :: m инициализируется нулем)

В компиляторе, совместимом с C ++ 03, все должен работать следующим образом:

  • new A - неопределенное значение
  • new A() - значение-инициализация A, которая является нулевой инициализацией, поскольку это POD.
  • new B - default-initializes (оставляет B :: m uninitialized)
  • new B() - значение-инициализирует B, который нуль инициализирует все поля, поскольку его по умолчанию ctor генерируется компилятором в противоположность определяемый пользователем.
  • new C - по умолчанию инициализирует C, который вызывает значение по умолчанию ctor.
  • new C() - значение инициализирует C, который вызывает значение по умолчанию ctor.

Итак, во всех версиях C ++ существует разница между new A и new A(), поскольку A является POD.

И есть разница в поведении между C ++ 98 и C ++ 03 для случая new B().

Это один из пыльных углов C ++, который может свести вас с ума. Когда вы строите объект, иногда вам нужны / нужны парнеры, иногда вы их абсолютно не можете, и иногда это не имеет значения.

19
задан cagcowboy 25 September 2008 в 22:18
поделиться

8 ответов

Здесь индексы становятся непригодными для использования без файла:

DECLARE
  CURSOR  usr_idxs IS select * from user_indexes;
  cur_idx  usr_idxs% ROWTYPE;
  v_sql  VARCHAR2(1024);

BEGIN
  OPEN usr_idxs;
  LOOP
    FETCH usr_idxs INTO cur_idx;
    EXIT WHEN NOT usr_idxs%FOUND;

    v_sql:= 'ALTER INDEX ' || cur_idx.index_name || ' UNUSABLE';
    EXECUTE IMMEDIATE v_sql;
  END LOOP;
  CLOSE usr_idxs;
END;

Перестройка будет аналогичной.

18
ответ дан 30 November 2019 в 03:48
поделиться

объединение 3 ответов вместе: (потому что избранный оператор не выполняется, DDL)

set pagesize 0

alter session set skip_unusable_indexes = true;
spool c:\temp\disable_indexes.sql
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;
spool off
@c:\temp\disable_indexes.sql

Действительно импортируют...

select 'alter index ' || u.index_name || 
' rebuild online;' from user_indexes u;

Примечание это предполагает, что импорт собирается произойти на той же (sqlplus) сессии.
при вызове "импорта", он будет работать на отдельной сессии, таким образом, необходимо было бы использовать, "ИЗМЕНЯЮТСЯ, СИСТЕМА" вместо "ИЗМЕНЯЮТ СЕССИЮ" (и не забудьте помещать параметр, поддерживают способ, которым Вы нашли его.

6
ответ дан 30 November 2019 в 03:48
поделиться

Если Вы используете непараллельные загрузки прямого пути, затем рассматривают и сравнивают не отбрасывания индексов вообще, особенно если индексы только покрывают меньшинство столбцов. Oracle имеет механизм для эффективного обслуживания индексов на загрузках прямого пути.

Иначе, я также советовал бы делать индексы неприменимыми вместо того, чтобы отбросить их. Меньше шанса случайно не воссоздания индекса.

3
ответ дан 30 November 2019 в 03:48
поделиться

Можно отключить ограничения в Oracle, но не индексах. Существует команда для создания индекса ununsable, но необходимо восстановить индекс так или иначе, таким образом, я, вероятно, просто записал бы сценарий, чтобы отбросить и восстановить индексы. Можно использовать user_indexes и user_ind_columns, чтобы получить все индексы для схемы или использовать dbms_metadata:

select dbms_metadata.get_ddl('INDEX', u.index_name) from user_indexes u;
2
ответ дан 30 November 2019 в 03:48
поделиться

Отсюда: http://forums.oracle.com/forums/thread.jspa?messageID=2354075

alter session set skip_unusable_indexes = true;

alter index your_index unusable;

действительно импортирует...

alter index your_index rebuild [online];

2
ответ дан 30 November 2019 в 03:48
поделиться

Объединение двух ответов:

Первый создают sql для создания всего индекса неприменимым:

alter session set skip_unusable_indexes = true;
select 'alter index ' || u.index_name || ' unusable;' from user_indexes u;

Действительно импортируют...

select 'alter index ' || u.index_name || ' rebuild online;' from user_indexes u;
1
ответ дан 30 November 2019 в 03:48
поделиться

Если вы используете Oracle 11g, вы также можете проверить dbms_index_utl .

2
ответ дан 30 November 2019 в 03:48
поделиться

Вам следует попробовать параметр sqlldr SKIP_INDEX_MAINTENANCE.

0
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: