漏洞
在 Oracle 的地理数据库中未创建 S$_IX2 索引,该索引可简化从 SDE.ST_Geometry 空间表中删除行。
由于索引缺失,在编辑(尤其是删除)过程中可能会出现性能问题。
此问题将在 10.1 SP1 宗地编辑性能修补程序中修复。
索引缺失。
select table_name, index_name from user_indexes where table_name='S1_IDX$' and index_name like '%IX2'; 未选择行
如果索引存在,则查询应返回一条记录:
select table_name, index_name from user_indexes where table_name='S1_IDX$' and index_name like '%IX2'; TABLE_NAME INDEX_NAME ------------------------------ ------------------------------ S1_IDX$ S1$_IX2
必须创建索引。
以下两个选项可用于创建所需索引:选项 1 - 手动创建索引,或者选项 2 - 使用本文中提供的脚本确定缺失的索引并进行创建。
示例:
select geom_id from sde.st_geometry_columns where table_name='RIVERS' and owner='AKESAR';
示例:
CREATE INDEX AKESAR."S###$_IX2" ON AKESAR.S###_IDX$ ("SP_ID") PCTFREE 0 INITRANS 8 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS;
其中“###”是在步骤 1 中得到的 sde.st_geometry_columns 表中的 geom_id。
注: 用户必须具有以下权限: SELECT ON dba_indexes
示例:
此视图显示具有缺失 sp_id 列索引的
S 表的图层。
CREATE OR REPLACE VIEW st_geom_missing_index_v AS SELECT stgi.owner, stgi.table_name layer_name, stgi.index_name, stgi.index_id index_id, 'S' || stgi.index_id || '_IDX$' s_table_name, 'S' || stgi.index_id || '$_IX2' missing_index_name FROM sde.st_geometry_index stgi LEFT JOIN dba_indexes dbaix ON stgi.owner = dbaix.owner AND ('S' || stgi.index_id || '_IDX$') = dbaix.table_name AND ('S' || stgi.index_id || '$_IX2') = dbaix.index_name WHERE dbaix.index_name IS NULL ORDER BY 1,2,3;
示例:
SELECT * FROM st_geom_missing_index_v; OWNER LAYER_NAME INDEX_NAME INDEX_ID S_TABLE_NAME MISSING_INDEX_NAME ------ ---------- ---------- -------- ------------ ------------------ AKESAR RIVERS S1$_IX1 1 S1_IDX$ S1$_IX2
注: 用户必须具有以下权限: SELECT ANY TABLE SELECT ON dba_indexes CREATE ANY INDEX CREATE PROCEDURE
CREATE or REPLACE PROCEDURE fix_missing_gdb_sp_id_indexes IS v_sql VARCHAR2(512); /* 通过连接以下两个表来识别缺失的索引: SDE.ST_GEOMETRY_INDEX DBA_INDEXES 每个图层的空间索引表名称 = 'S' || st_geometry_index.index_id || '_IDX$' 每个 SP_ID 列索引名称 = 'S' || st_geometry_index.index_id || '$_IX2' */ CURSOR c_missing_index_query IS SELECT stgi.owner, stgi.table_name layer_name, stgi.index_name, stgi.index_id index_id, 'S' || stgi.index_id || '_IDX$' s_table_name, 'S' || stgi.index_id || '$_IX2' missing_index_name FROM sde.st_geometry_index stgi LEFT JOIN dba_indexes dbaix ON stgi.owner = dbaix.owner AND ('S' || stgi.index_id || '_IDX$') = dbaix.table_name AND ('S' || stgi.index_id || '$_IX2') = dbaix.index_name WHERE dbaix.index_name IS NULL ORDER BY 1,2,3; BEGIN -- 为 S 表缺失 SP_ID 索引的每一个图层,创建一个索引。 FOR rec IN c_missing_index_query LOOP v_sql := 'CREATE INDEX ' || rec.owner || '.' || rec.missing_index_name || ' ON ' || rec.owner || '.' || rec.s_table_name || '(sp_id)'; BEGIN dbms_output.put_line(v_sql); EXECUTE IMMEDIATE v_sql; EXCEPTION WHEN OTHERS THEN RAISE; END; END LOOP; EXCEPTION WHEN OTHERS THEN RAISE; END;
set serveroutput on exec fix_missing_gdb_sp_id_indexes; CREATE INDEX AKESAR.S1$_IX2 ON AKESAR.S1_IDX$(sp_id) PL/SQL 步骤成功完成。
SELECT * FROM st_geom_missing_index_v; 未选择行
获取来自 ArcGIS 专家的帮助
下载 Esri 支持应用程序