Документ создан: 16.02.2010

Индексы

Пересоздать все UNUSABLE-индексы

SET serveroutput ON
begin
  FOR i IN (SELECT owner,index_name 
            FROM dba_indexes 
            WHERE STATUS = 'UNUSABLE' 
                  AND index_name NOT LIKE 'SYS_%')
  loop
    execute immediate 'alter index '||i.owner||'.'||i.index_name||' rebuild';
  end loop;
end;
/

Перенос определённого partitioned index в другое табличное пространство

SET serveroutput ON 
begin
  FOR i IN (SELECT index_owner,index_name, partition_name,tablespace_name,STATUS 
            FROM DBA_IND_PARTITIONS 
            WHERE index_name='FILEDS_INDX1_PAR' AND tablespace_name='TS')
  loop
    execute immediate 'alter index '||i.index_owner||'.'
            ||i.index_name||' rebuild partition '||i.partition_name
            ||' tablespace TS_INDX';
  end loop;
end;
/

Связь таблиц в схеме

SELECT ucc1.table_name
     , ucc1.column_name
     , ucc1.constraint_name
     , uc1.table_name master_table
     , uc1.constraint_name master_constraint_name
     , ucc2.column_name master_column_name
FROM user_cons_columns ucc1
   , user_cons_columns ucc2
   , user_constraints uc1
   , user_constraints uc2
WHERE uc1.constraint_type='P'
  AND ucc2.constraint_name = uc1.constraint_name
  AND uc2.r_constraint_name = uc1.constraint_name
  AND ucc1.constraint_name = uc2.constraint_name
ORDER BY ucc1.table_name;

Пересоздание связей

Сегментирование таблиц не может быть выполнено на существующей таблице. Для этого выполняется создание сегментированной таблицы схожей по структуре с исходной, но без данных. Для соблюдения целостности данных рекомендуется, перед переносом данных из исходной таблицы в сегментированную, переименовать исходную таблицу. В этом случае все связи автоматически перенастраиваются на переименованную таблицу и для восстановления связей с сегментированной таблицей их нужно пересоздать. Нижеприведённый запрос формирует строки удаления констрейнтов и создания новых.

SELECT 'alter table '
            || ucc1.table_name
            || ' drop constraint '
            ||ucc1.constraint_name
            ||';'
            ||chr(10)
            ||
       'alter table '
            ||ucc1.table_name
            || ' add constraint '
            ||ucc1.constraint_name
            ||' foreign key ('||ucc1.column_name||') '
            ||'references <VALID_TABLE_NAME> ('||ucc2.column_name||')'
            || decode(uc2.delete_rule, 'NO ACTION', NULL,' on delete '||uc2.delete_rule)
            ||' ;'
FROM user_cons_columns ucc1
   , user_cons_columns ucc2
   , user_constraints uc1
   , user_constraints uc2
WHERE uc1.constraint_type='P'
  AND uc1.table_name = '<VALID_TABLE_NAME>'
  AND ucc2.constraint_name = uc1.constraint_name
  AND uc2.r_constraint_name = uc1.constraint_name
  AND ucc1.constraint_name = uc2.constraint_name
ORDER BY ucc1.table_name;

Индексы по полям с NULL

Начиная с Oracle 11g стало возможным добавлять в индексы поля с NULL. Пример отсюда:

CREATE INDEX
    emp_ename_idx
ON
   emp 
   (ename ASC, 1)
;
 
Top.Mail.Ru
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate