sql >> Base de Datos >  >> RDS >> Oracle

Índice de partición de Oracle

En el artículo anterior, aprendimos sobre la tabla con particiones de Oracle. Como continuación de esa serie, presentaré aquí el índice de partición de Oracle

Estos son algunos de los datos sobre la comprensión de los índices particionados

Índices de partición local

  • Se crea un índice local en una tabla particionada donde el índice se particiona exactamente de la misma manera que la tabla particionada subyacente. Es decir, el índice local hereda el método de partición de la tabla. Esto se conoce como partición equitativa.
  • Para índices locales, las claves de índice dentro del índice se referirán solo a las filas almacenadas en la única partición de tabla subyacente. Un índice local se crea especificando el atributo LOCAL y se puede crear como ÚNICO o NO ÚNICO.
  • La tabla y el índice local se dividen exactamente de la misma manera o tienen la misma clave de partición porque los índices locales se mantienen automáticamente y pueden ofrecer una mayor disponibilidad.
  • Como la base de datos de Oracle garantiza que las particiones de índice estén sincronizadas con sus particiones de tabla correspondientes, la base de datos mantiene automáticamente la partición de índice cada vez que se realiza una operación de mantenimiento en las tablas subyacentes
  • por ejemplo, cuando se agregan, eliminan o fusionan particiones.
  • Se antepone un índice local si la clave de partición de la tabla y la clave de índice son las mismas; de lo contrario, es un índice local sin prefijo
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id)
  LOCAL
  (partition test_idx_1,
  partition test_idx_2,
  partition test_idx_3,
  partition test_idx_4);
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='TEST_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 ---------   -----------    ------
 TEST_IDX IX_TEST_IDX_1 USABLE
 TEST_IDX IX_TEST_IDX_2 USABLE
 TEST_IDX IX_TEST_IDX_3 USABLE
 TEST_IDX IX_TEST_IDX_4 USABLE

Índices particionados globales

  • Un índice particionado global es un índice en una tabla particionada o no particionada que se particiona de forma independiente, es decir, utilizando una clave de partición diferente de la tabla. Los índices con particiones globales pueden tener particiones por rango o hash. Los índices con particiones globales son más difíciles de mantener que los índices locales. Sin embargo, ofrecen un método de acceso más eficiente a cualquier registro individual.
  • Durante la interacción de tablas o índices durante el mantenimiento de particiones, todas las particiones en un índice global se verán afectadas.
  • Cuando la partición de la tabla subyacente tiene operaciones de mantenimiento SPLIT, MOVE, DROP o TRUNCATE, tanto los índices globales como los índices particionados globales se marcarán como inutilizables. Por lo tanto, se deduce que la independencia de la partición no es posible para los índices globales.
  • Según el tipo de operación realizada en una partición de tabla, los índices de la tabla se verán afectados. Al modificar una partición de tabla, se puede especificar la cláusula UPDATE INDEXES. Esto mantiene automáticamente las particiones y los índices globales afectados.
  • Las ventajas de usar esta opción son que el índice permanecerá en línea y disponible durante toda la operación, y no tendrá que reconstruirse una vez que se haya completado la operación.
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id)
  GLOBAL PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_IDX_1 values less than (20, 200),
   partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue));
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='EXP_PART_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 
 EXP_PART_IDX EXP_PART_IDX_1 USABLE
 EXP_PART_IDX EXP_PART_IDX_2 USABLE

Índices globales no particionados

  • Los índices globales sin particiones ofrecen el mismo acceso eficiente a cualquier registro individual en cualquier partición y se comportan como un índice sin particiones. Dado que la estructura del índice no está dividida, el índice está disponible para todas las particiones.
  • Un escenario donde este tipo de índice sería útil es con una consulta que no incluye la clave de partición de la tabla como filtro, pero aún desea que el optimizador de Oracle use un índice

Preguntas frecuentes

¿Qué es el índice prefijado y sin prefijo?

El índice se denomina con prefijo si la(s) columna(s) inicial(es) en la definición del índice es(son) la(s) columna(s) de la clave de partición; de lo contrario, se denomina sin prefijo.

¿Podemos subparticionar el índice global?

No, no puede subparticionar el índice global, pero puede particionarlo. La única forma de terminar con una subpartición de índice es tener una tabla subparticionada con índice local

Cómo averiguar si un índice es global o local

Consultando la columna, LOCALIDAD, en DBA_PART_INDEXES.

También lee

  • Tutoriales de administración de la base de datos de Oracle
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • cambiar formato de fecha en Oracle