BUG

NIM084235: St_Geometry spatial indexes do not create S###$_IX2 indexes on the IOT SP_ID column

Last Published: April 25, 2020

Beschreibung

Der Index "S$_IX2", der das Löschen von Zeilen aus einer räumlichen Tabelle des Typs "SDE.ST_Geometry" ermöglicht, wird in Oracle-Geodatabases nicht erstellt.

Wenn der Index fehlt, können bei der Bearbeitung, insbesondere bei Löschungen, Performance-Probleme auftreten.

Dieses Problem wird mit dem 10.1 SP1 Parcel Editing Performance Patch behoben.

Ursache

Der Index fehlt.

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

no rows selected

Wenn der Index vorhanden ist, sollte die Abfrage einen Datensatz zurückgeben:

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

Problemumgehung

Der Index muss erstellt werden.

Nachstehend werden zwei Optionen zum Erstellen des erforderlichen Index beschrieben. Mit Option 1 wird der Index manuell erstellt, bei Option 2 verwenden Sie das in diesem Artikel bereitgestellte Skript, um die fehlenden Indizes zu ermitteln und zu erstellen.


Option 1: Erstellen Sie den Index manuell:
  1. Wählen Sie die "geom_id" in der Tabelle "sde.st_geometry_columns" für die Tabelle "st_geometry" mit dem fehlenden Index aus.

Beispiel:

select geom_id from sde.st_geometry_columns where table_name='RIVERS' and owner='AKESAR';
  1. Erstellen Sie den Index:

Beispiel:

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

Wobei "###" die "geom_id" der in Schritt 1 gefundenen Tabelle "sde.st_geometry_columns" ist.


Option 2: Zeigen Sie alle fehlenden IOT SP_ID-Indizes an, und erstellen Sie sie mit einem Skript neu:
  1. (optional): Erstellen Sie eine Sicht, in der alle Tabellen mit fehlendem Index angezeigt werden können.
Hinweis:
Der Benutzer muss über die folgenden Berechtigungen verfügen:
SELECT ON dba_indexes

Beispiel:
In dieser Sicht werden die Layer mit S-Tabellen angezeigt, in denen der
Spaltenindex "sp_id" fehlt.

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. (optional): Wählen Sie alle Tabellen mit fehlendem Index aus, indem Sie die in Schritt 1 erstellte Sicht abfragen.

Beispiel:

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
Hinweis:
Der Benutzer muss über die folgenden Berechtigungen verfügen:
SELECT ANY TABLE
SELECT ON dba_indexes
CREATE ANY INDEX
CREATE PROCEDURE
  1. Create a stored procedure that creates the indexes.
 CREATE or REPLACE PROCEDURE fix_missing_gdb_sp_id_indexes
IS
  v_sql VARCHAR2(512);

  /*
   Identify missing indexes by joining these two tables:
   SDE.ST_GEOMETRY_INDEX
   DBA_INDEXES
   Each Layer's Spatial Index table name = 
                                  'S' || st_geometry_index.index_id || '_IDX$'
   Each SP_ID column index name =
                                  '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

    -- For each layer with an S table missing its SP_ID index, create one.
    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. Führen Sie die in Schritt 3 erstellte gespeicherte Prozedur aus, um die Indizes zu erstellen.
Beispiel:
set serveroutput on

exec fix_missing_gdb_sp_id_indexes;

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

Die PL/SQL-Prozedur wurde erfolgreich abgeschlossen.
  1. (optional): Fragen Sie die in Schritt 1 erstellte Sicht ab, um sicherzustellen, dass die fehlenden Indizes nicht mehr angezeigt werden.
Beispiel:
SELECT * FROM st_geom_missing_index_v;

no rows selected

Artikel-ID:000011727

Hilfe von ArcGIS-Expert*innen erhalten

Technischen Support kontaktieren

Die Esri Support-App herunterladen

Zu den Download-Optionen

Zugehörige Informationen

Weitere Informationen zu diesem Thema erkunden