En este documento, se describen los errores que puedes encontrar cuando generas un índice de ScaNN. También se proporcionan ejemplos de errores y correcciones recomendadas.
Como solución alternativa general, puedes inhabilitar la generación de estos errores y seguir generando el índice. Para obtener más información, consulta Cómo forzar la creación de índices en tablas vacías o pequeñas.
No se puede crear un índice de ScaNN con una tabla vacía
Descripción
Cuando intentas generar un índice en una tabla sin datos o si intentas truncar una tabla con un índice de ScaNN generado en ella, se produce el siguiente error:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: FAILED_PRECONDITION: Cannot create ScaNN index "[INDEX_NAME]" with empty table "[TABLE_NAME]". Once the table is populated with data, create the index. See documentation to bypass this validation.
Ejemplos de consultas que causan el error
Ejemplo de consulta 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');Ejemplo de búsqueda B
truncate t1;
Solución recomendada
Asegúrate de que tu tabla esté propagada con vectores de embedding antes de generar un índice de ScaNN.
No se puede crear el índice de ScaNN
Descripción
Cuando intentas generar un índice en una tabla con pocas filas completadas, se produce el siguiente error:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: INVALID_ARGUMENT: Number of rows ([ACTUAL]) must be larger than ([EXPECTED]).
Ejemplo de consulta que causa 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');
Solución recomendada
Asegúrate de que tu tabla esté completada con vectores de embedding antes de generar un índice de ScaNN. Te recomendamos que la cantidad de filas de la tabla sea mayor que el valor definido en el parámetro num_leaves.
No se puede crear un índice de ScaNN para una tabla con solo una fila
Descripción
Este error se produjo porque ScaNN (y la mayoría de los índices de ANN, como IVFFlat) necesitan un conjunto de entrenamiento para compilar sus estructuras internas (clústeres o nodos hoja). Cuando insertas exactamente una fila , recibes el siguiente error:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: INVALID_ARGUMENT: Number of samples "[NUM_SAMPLES]" must be larger than 1 and the number of leaves "[NUM_LEAVES]"
Ejemplo de consulta que causa 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, 1);
INSERT 0 1
create index on t1 using scann(b cosine) with (num_leaves = 1, quantizer = 'sq8');
Solución recomendada
Asegúrate de que tu tabla esté completada con vectores de incorporación antes de generar un índice de ScaNN. Recomendamos que la cantidad de filas de la tabla sea la siguiente:
- Mayor que 1
- Mayor que el valor definido en el parámetro
num_leaves
No se puede crear el índice de ScaNN en la tabla de partición principal
Descripción
Si creaste tablas particionadas a partir de una tabla principal, la creación de un índice de ScaNN en la tabla principal generará el siguiente error:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for parent partition table "[TABLE_NAME]". Create ScaNN indexes on the child tables instead. See documentation to bypass this validation.
Ejemplo de consulta que causa 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');
Solución recomendada
- No puedes generar un índice
ScaNNen la tabla principal de una tabla particionada. - Debes generar los índices
ScaNNen la tabla particionada.