как пространственный индекс oracle может быть поврежден?

#oracle #spatial-index #oracle-spatial

Вопрос:

Итак, у меня есть таблица с пространственным индексом Oracle. После некоторых DMLS индекс ломается. Я не знаю точно, когда это произойдет. Большую часть времени операторы УДАЛЕНИЯ и ОБНОВЛЕНИЯ выполняются в таблице. Кто-нибудь знает, почему индекс ломается и как я могу это предотвратить?

Это скрипт, который я использую для проверки и восстановления индекса:

 declare
  l_cnt number;
  l_msg varchar2(32000);
  l_err_msg varchar2(2000);
begin
  for rec in (select SDO_INDEX_OWNER,SDO_TABLE_NAME,SDO_INDEX_NAME,SDO_RTREE_HEIGHT
    from all_sdo_index_metadata
   where SDO_INDEX_OWNER = 'OWNER'
  ) loop
    begin
      execute immediate 'SELECT count(*) FROM table(mdsys.sdo_rtree_admin.sdo_rtree_descrids(:index_owner,:index_name,:rtree_height)) A
      WHERE a.column_value NOT IN (SELECT ROWID FROM '||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||')'
                into l_cnt using rec.SDO_INDEX_OWNER, rec.SDO_INDEX_NAME, rec.SDO_RTREE_HEIGHT;
      if l_cnt > 0 then
            execute immediate 'alter index '||rec.SDO_INDEX_OWNER||'.'||rec.SDO_INDEX_NAME||' rebuild online';
                :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||' Index '||rec.SDO_INDEX_NAME||' neu aufgebaut'||chr(10);
                -- l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||' Index '||rec.SDO_INDEX_NAME||' neu aufgebaut'||chr(10);
          else
            :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||chr(10);
            -- l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||chr(10);
          end if;
    exception
        when others then
          l_err_msg := sqlerrm;
          --l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_err_msg;
          :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_err_msg||chr(10);
        end;
  end loop;
end;
 

Комментарии:

1. Есть ли какие-либо сообщения в журнале предупреждений? Как насчет файлов трассировки в каталоге дампа?

2. можете ли вы определить «перерывы»? Что такое USER_INDEXES.STATUS ?

3. я добавил скрипт, который использую для проверки и восстановления индекса

4. Какие именно ошибки вы получаете в своем приложении ?

5. ORA-13199: Ошибка фиксации Пространственного индекса. После перестройки ошибка исчезла.

Ответ №1:

Какова ваша версия Oracle? Ваш скрипт не компилируется в 11.2.0.4.
Кроме того, пример After some DMLs the index breaks ? Я никогда не видел DML, способного разбить индекс.
Вот сценарий, который я использую уже много лет, HTH

     select di.TABLE_owner, di.TABLE_NAME, di.owner idx_owner, di.INDEX_NAME, dc.column_name, 
        di.PARAMETERS, 
        di.STATUS, di.DOMIDX_STATUS, di.DOMIDX_OPSTATUS, sit.SDO_INDEX_STATUS, di.FUNCIDX_STATUS, 
        sit.sdo_index_table, sit.SDO_TABLESPACE, sit.SDO_TSNAME, sit.SDO_RTREE_SEQ_NAME, di.LAST_ANALYZED, di.NUM_ROWS, di.PARTITIONED 
   from DBA_INDEXES di, DBA_IND_COLUMNS dc, mdsys.SDO_INDEX_METADATA_TABLE sit
  where index_type = 'DOMAIN' 
    and di.TABLE_owner in ('OWNER')     --a table has an (table_)owner
    and di.owner=dc.index_owner and di.owner=sit.sdo_index_owner   --its index maybe in another owner. the index owner= col.indx.owner sdo.indx.owner
    and di.INDEX_NAME=dc.INDEX_NAME and di.index_name= sit.sdo_INDEX_NAME --same w ind.name
    and di.table_name=dc.TABLE_NAME 
    and (di.STATUS!='VALID' or sit.SDO_INDEX_STATUS!='VALID' or di.DOMIDX_STATUS!='VALID' or di.DOMIDX_OPSTATUS!='VALID' )     
  order by di.TABLE_owner, di.TABLE_NAME, di.INDEX_NAME, dc.column_position, dc.column_name ;
 

Комментарии:

1. Оракул-19с. DML действительно похож: вставьте в таблицу значения geomrow или удалите из таблицы, в которой нет идентификатора (выберите geom_id_fk из TableB); Это странная часть