Este documento descreve os erros que podem ocorrer ao gerar um índice do ScaNN. Exemplos de erros e correções recomendadas também são apresentados.
Como solução alternativa geral, você pode desativar a geração desses erros e continuar gerando o índice. Para mais informações, consulte Forçar a criação de índice em tabelas vazias ou pequenas.
Não é possível criar um índice ScaNN com uma tabela vazia
Descrição
Quando você tenta gerar um índice em uma tabela sem dados ou truncar uma tabela com um índice do ScaNN gerado nela, ocorre o seguinte erro:
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.
Exemplos de consultas que causam o erro
Exemplo 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');Exemplo de consulta B
truncate t1;
Correção recomendada
Verifique se a tabela está preenchida com vetores de embedding antes de gerar um índice do ScaNN.
Não é possível criar um índice ScaNN
Descrição
Quando você tenta gerar um índice em uma tabela com poucas linhas preenchidas, ocorre o seguinte erro:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: INVALID_ARGUMENT: Number of rows ([ACTUAL]) must be larger than ([EXPECTED]).
Exemplo de consulta que causa o erro
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');
Correção recomendada
Verifique se a tabela está preenchida com vetores de embedding antes de gerar um índice ScaNN. Recomendamos que o número de linhas na tabela seja maior que o valor definido no parâmetro num_leaves.
Não é possível criar um índice do ScaNN para uma tabela com apenas uma linha
Descrição
Esse erro ocorreu porque o ScaNN (e a maioria dos índices de ANN, como o IVFFlat) precisa de um conjunto de treinamento para criar as estruturas internas (clusters/folhas). Quando você insere exatamente uma linha , recebe o seguinte erro:
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]"
Exemplo de consulta que causa o erro
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');
Correção recomendada
Verifique se a tabela está preenchida com vetores de incorporação antes de gerar um índice do ScaNN. Recomendamos que o número de linhas na tabela seja:
- Maior que 1
- Maior que o valor definido no parâmetro
num_leaves
Não é possível criar um índice do ScaNN na tabela de partição principal
Descrição
Se você criou tabelas particionadas com base em uma tabela mãe, a criação de um índice do ScaNN na tabela mãe vai gerar o seguinte erro:
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.
Exemplo de consulta que causa o erro
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');
Correção recomendada
- Não é possível gerar um índice
ScaNNna tabela mãe de uma tabela particionada. - Você precisa gerar os índices
ScaNNna tabela particionada.