ERROR

NIM084235: Los índices espaciales de St_Geometry no crean índices S###$_IX2 en la columna SP_ID de la IOT

Last Published: April 25, 2020

Descripción

El índice S$_IX2 que facilita la eliminación de filas en una tabla espacial de SDE.ST_Geometry no se crea en las geodatabases de Oracle.

Debido a la ausencia del índice, pueden que se observen problemas de rendimiento durante la edición, especialmente en las eliminaciones.

Este problema se ha corregido en el Parche de rendimiento de edición de parcelas de 10.1 SP1.

Causa

Falta el índice.

select table_name, index_name from user_indexes where table_name='S1_IDX$' and index_name like '%IX2';

no hay ninguna fila seleccionada

Si el índice está presente, la consulta debería devolver un único registro:

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

Solución alternativa

Es necesario crear el índice.

A continuación, se presentan dos opciones para crear el índice necesario, Opción 1: Crear el índice manualmente u Opción 2: Usar el script proporcionado en este artículo para determinar qué índices faltan y crearlos.


Opción 1: Crear el índice manualmente:
  1. Seleccione el geom_id de la tabla sde.st_geometry_columns para la tabla st_geometry que carece de índice.

Ejemplo:

select geom_id from sde.st_geometry_columns where table_name='RIVERS' and owner='AKESAR';
  1. Crear el índice:

Ejemplo:

CREATE INDEX AKESAR."S###$_IX2" ON AKESAR.S###_IDX$ ("SP_ID") PCTFREE 0 INITRANS 8 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS;

Donde "####" es el geom_id de la tabla sde.st_geometry_columns del paso 1.


Opción 2: Ver todos los índices SP_ID de la IOT que faltan y recrearlos con un script:
  1. (opcional): Cree una vista que se pueda utilizar para ver todas las tablas que carecen de índice.
Nota:
El usuario debe tener estos privilegios:
   SELECT ON dba_indexes

Ejemplo:
Esta vista muestra qué capas presentan tablas S que carecen del
índice de columnas sp_id.

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. (opcional): Seleccione todas las tablas que carecen de índice mediante una consulta de la vista creada en el paso 1.

Ejemplo:

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
Nota:
El usuario debe tener estos privilegios:
 SELECT ANY TABLE
   SELECT ON dba_indexes
 CREATE ANY INDEX
 CREATE PROCEDURE
  1. Cree un procedimiento almacenado que cree los índices.
 CREATE or REPLACE PROCEDURE fix_missing_gdb_sp_id_indexes
IS
  v_sql VARCHAR2(512);

  /*
   Identifique los índices ausentes uniendo estas dos tablas:
   SDE.ST_GEOMETRY_INDEX
   DBA_INDEXES
   Para cada nombre de tabla de índice espacial de la capa = 
                                  'S' || st_geometry_index.index_id || '_IDX$'
   Para cada nombre de índice de columna 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

    -- Para cada capa con una tabla S que carece de su índice SP_ID, cree una.
    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. Ejecute el procedimiento almacenado creado en el paso 3 para crear los índices.
Ejemplo:
set serveroutput on

exec fix_missing_gdb_sp_id_indexes;

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

Procedimiento PL/SQL completado correctamente.
  1. (opcional): Consulte la vista creada en el paso 1 para asegurarse de que los índices ausentes ya no se muestren.
Ejemplo:
SELECT * FROM st_geom_missing_index_v;

no hay ninguna fila seleccionada

Id. de artículo:000011727

Obtener ayuda de expertos en ArcGIS

Contactar con soporte técnico

Descargar la aplicación de soporte de Esri

Ir a las opciones de descarga

Información relacionada

Descubrir más sobre este tema