Esta página fue traducida automáticamente. Lee el original en inglés. English

Biblioteca de IBSurgeon

Creación concurrente de índices en Firebird 5

Actualmente, cuando se construye un índice, no se permite ninguna modificación de los datos de la tabla. Esto es necesario para crear un índice correcto sin perder nuevas claves insertadas durante la construcción.

El algoritmo de construcción de índices concurrentes permite acortar significativamente el tiempo durante el cual se requiere dicho bloqueo de lectura. Si bien no elimina por completo la necesidad de bloquear modificaciones concurrentes de los datos de la tabla, el tiempo de dicho bloqueo es mucho menor en comparación con el algoritmo tradicional no concurrente. Esto es especialmente útil en entornos de producción donde bloquear la actividad de los usuarios durante períodos prolongados es poco práctico o imposible.

Debido a la carga concurrente y la complejidad adicional, la creación de índices concurrentes podría tardar más que el enfoque tradicional.

Sintaxis

La nueva palabra clave opcional no reservada CONCURRENTLY se utiliza para especificar la creación de índices concurrentes.

Crear un nuevo índice

Code
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]  INDEX indexname ON tablename  {(col [, col ...]) | COMPUTED BY ()}  [WHERE ]  [CONCURRENTLY]

Activar un índice existente

Code
ALTER INDEX indexname {ACTIVE | INACTIVE}  [CONCURRENTLY]

Nota: CONCURRENTLY solo se puede usar con ACTIVE.

Validación de unicidad

Es difícil o imposible verificar la unicidad de un índice mientras se construye de forma concurrente. Por lo tanto, cuando se crea (o activa) un índice único de forma concurrente, se marca inmediatamente como NOT VALIDATED en el catálogo del sistema. La unicidad del índice se valida después de que la construcción del índice esté completa, cuando el índice contiene claves para todos los registros de la tabla.

Si la verificación de unicidad tiene éxito, se elimina la marca NOT VALIDATED.

Si la verificación de unicidad falla, el índice permanece activo y se marca como NOT VALIDATED. Posteriormente, el usuario puede encontrar y corregir duplicados y validar la unicidad nuevamente, o eliminar el índice si corresponde.

Nota: un índice único NOT VALIDATED aún no permite ingresar duplicados en la tabla.

Para validar un índice único, ejecute:

Code
ALTER INDEX indexname VALIDATE UNIQUE

Esta declaración realiza un escaneo del índice para encontrar claves duplicadas y verificar los registros correspondientes. Si no se encuentran duplicados, se elimina la marca NOT VALIDATED y el índice se considera validado. De lo contrario, la marca NOT VALIDATED permanece y el índice puede validarse nuevamente más tarde.

El comando SHOW INDEX de isql ahora muestra la marca NOT VALIDATED, si está presente.

Restricciones de tabla

La creación concurrente de índices para restricciones de tabla, como PRIMARY|UNIQUE|FOREIGN KEY, aún no es compatible. Es posible admitir PRIMARY|UNIQUE KEY en el futuro, pero es poco probable para FOREIGN KEY.

Ejemplos

Prepare una tabla con algunos datos:

Code
create table tab (  id int not null,  f1 varchar(64));
insert into tab values (1, '1');
insert into tab values (1, '2');commit;

Cree un índice usando la cláusula CONCURRENTLY:

Code
create index idx_tab_f1 on tab(f1) concurrently;

Cree un índice único en una columna con duplicados:

Code
create unique index idx_tab_id on tab(id);

Esto genera un error:

Code
Statement failed, SQLSTATE = 23000
attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

Cree el mismo índice único usando CONCURRENTLY:

Code
create unique index idx_tab_id on tab(id) concurrently;

Esto genera una advertencia:

Code
Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

Verifique si el índice existe:

Code
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)

Observe la marca NOT VALIDATED.

Valide el índice:

Code
alter index idx_tab_id validate unique;
Statement failed, SQLSTATE = 23000
unsuccessful metadata update-Validation of unique index "IDX_TAB_ID" failed.
-attempt to store duplicate value (visible to active transactions) in unique index "IDX_TAB_ID"
-Problematic key value is ("ID" = 1)

Corrija el registro duplicado y valide nuevamente:

Code
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;

Sin errores.

Verifique el estado del índice:

Code
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)

Descargue HQbird y pruébelo ahora: /es/download-hqbird