【发布时间】:2021-10-24 10:57:13
【问题描述】:
所以我有一个带有 Oracle 空间索引的表。在一些 DML 之后,索引会中断。我不知道这到底是什么时候发生的。大多数时候 DELETE 和 UPDATE 语句是在表上执行的。有谁知道为什么索引会中断以及如何防止这种情况发生?
这是我用来检查和修复索引的脚本:
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;
【问题讨论】:
-
警报日志中是否有任何消息?转储目录中的跟踪文件如何?
-
你能定义“休息”吗? USER_INDEXES.STATUS 是什么?
-
我已经添加了用于检查和修复索引的脚本
-
您在应用程序中遇到了哪些具体错误?
-
ORA-13199:空间索引提交失败。重建后错误消失了。
标签: oracle spatial-index oracle-spatial