Solucionar errores de índice de ScaNN

Selecciona una versión de la documentación:

En este documento se describen los errores que pueden producirse al generar un índice ScaNN. También se proporcionan ejemplos de errores y correcciones recomendadas.

Lista de errores

A continuación, se muestra una lista de errores que se generan al intentar crear un índice ScaNN. Puedes inhabilitar la generación de estos errores y seguir generando el índice. Para obtener más información, consulta Forzar la creación de índices y suprimir errores.

ERROR: No se puede crear un índice de ScaNN con una tabla vacía

Mensaje de error

Si intentas generar un índice en una tabla sin datos o truncar una tabla con un índice ScaNN generado en ella, se produce el siguiente error:

ERROR: Cannot create ScaNN index with empty table. Once the table is populated with data, create the index. See documentation to bypass this validation.

Consultas de ejemplo que provocan el error

  • Consulta de ejemplo A

    create table t1 (a INT, b VECTOR(512));
    CREATE TABLE
    create index on t1 using ScaNN(b cosine) with (num_leaves = 10, quantizer = 'sq8');
    
  • Consulta de ejemplo B

    truncate t1;
    

Asegúrate de que la tabla contenga vectores de inserción antes de generar un índice ScaNN.

ERROR: No se puede crear el índice de ScaNN

Mensaje de error

Si intentas generar un índice en una tabla con pocas filas, se produce el siguiente error:

Cannot create ScaNN index, error: INVALID_ARGUMENT: Number of row (5) must be larger than (1000).

Consulta de ejemplo que provoca el error

create table t1 (a INT, b VECTOR(512));
CREATE TABLE
insert into t1 select (random()*1e9)::int, random_vector(512) from generate_series(1, 5);
INSERT 0 5
create index on t1 using scann(b cosine) with (num_leaves = 100, quantizer = 'sq8');

Asegúrate de que la tabla contenga vectores de inserción antes de generar un índice ScaNN. Recomendamos que el número de filas de la tabla sea mayor que el valor definido en el parámetro num_leaves.

ERROR: No se puede crear un índice de ScaNN en la tabla de particiones principal.

Mensaje de error

Si ha creado tablas con particiones a partir de una tabla principal, al crear un índice ScaNN en la tabla principal se genera el siguiente error:

ERROR: Cannot create ScaNN index on parent partition table. Create ScaNN indexes on the child tables instead. See documentation to bypass this validation.

Consulta de ejemplo que provoca el error

create table t1 (a INT, b VECTOR(512)) partition by range(a);
CREATE TABLE
CREATE TABLE t1_one_ten PARTITION of t1 for values from (1) to (10);
CREATE TABLE
insert into t1_one_ten select (random()*1e9)::int, random_vector(512) from generate_series(1, 100);
INSERT 0 100
CREATE TABLE t1_eleven_twenty PARTITION of t1 for values from (11) to (20);
CREATE TABLE
insert into t1_eleven_twenty select (random()*1e9)::int, random_vector(512) from generate_series(1, 100);
INSERT 0 100
create index on t1 using scann(b cosine) with (num_leaves = 10, quantizer = 'sq8');

No puedes generar un índice ScaNN en la tabla principal de una tabla particionada. Debes generar los índices de ScaNN en la tabla con particiones.

Forzar la creación de índices y suprimir errores

Puedes obligar a AlloyDB a generar un índice y suprimir los errores. Antes de permitir la generación de índices con este método, ten en cuenta las siguientes implicaciones:

  • Como el índice se entrena con pocos datos o con ninguno, los centroides aprenden con cero datos, lo que provoca un mal recuerdo.
  • El rendimiento de escritura en la base de datos también puede ser lento.

Para forzar la generación del índice, haz lo siguiente:

  1. Define el parámetro scann.allow_blocked_operations creation a nivel de sesión en true en la base de datos:

    SET scann.allow_blocked_operations = true;
    
  2. Asigna el privilegio SUPERUSER al usuario que ejecutará estas consultas en la base de datos:

    CREATE USER USER_NAME WITH SUPERUSER PASSWORD PASSWORD;
    

    Haz los cambios siguientes:

    • USER_NAME: el nombre del usuario al que quieres conceder el privilegio.
    • PASSWORD: la contraseña del usuario.