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
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX indexname ON tablename {(col [, col ...]) | COMPUTED BY ()} [WHERE ] [CONCURRENTLY]
Activar un índice existente
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:
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:
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:
create index idx_tab_f1 on tab(f1) concurrently;
Cree un índice único en una columna con duplicados:
create unique index idx_tab_id on tab(id);
Esto genera un error:
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:
create unique index idx_tab_id on tab(id) concurrently;
Esto genera una advertencia:
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:
show index idx_tab_id;
IDX_TAB_ID UNIQUE NOT VALIDATED INDEX ON (ID)
Observe la marca NOT VALIDATED.
Valide el índice:
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:
update tab set id = 2 where f1 = '2';
commit;
alter index idx_tab_id validate unique;
Sin errores.
Verifique el estado del índice:
show index idx_tab_id;
IDX_TAB_ID UNIQUE INDEX ON (ID)
Descargue HQbird y pruébelo ahora: /es/download-hqbird