漏洞

错误:NIM084235:St_Geometry 空间索引未在 IOT SP_ID 列上创建 S###$$_IX2 索引

Last Published: April 25, 2020

描述

在 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 - 使用本文中提供的脚本确定缺失的索引并进行创建。


选项 1 - 手动创建索引:
  1. 针对缺失索引的 st_geometry 表,从 sde.st_geometry_columns 表中选择 geom_id。

示例:

select geom_id from sde.st_geometry_columns where table_name='RIVERS' and owner='AKESAR';
  1. 创建索引:

示例:

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。


选项 2 - 查看所有缺失的 IOT SP_ID 索引,并使用脚本重新创建这些索引:
  1. (可选):创建一个视图,该视图可用于查看所有缺少索引的表。
:
用户必须具有以下权限:
   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;
  1. (可选): 通过查询在步骤 1 中创建的视图,选择所有缺失索引的表。

示例:

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
  1. 创建一个用于创建索引的存储过程。
 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;
  1. 运行在步骤 3 中创建的存储过程以创建索引。
示例:
set serveroutput on

exec fix_missing_gdb_sp_id_indexes;

CREATE INDEX AKESAR.S1$_IX2 ON AKESAR.S1_IDX$(sp_id)

PL/SQL 步骤成功完成。
  1. (可选):查询在步骤 1 中创建的视图,以确保不再显示缺失的索引。
示例:
SELECT * FROM st_geom_missing_index_v;

未选择行

文章 ID:000011727

从 ArcGIS 专家处获得帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项

相关信息

发现关于本主题的更多内容