#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); Это странная часть