Resolva problemas relacionados com erros de índice do ScaNN

Selecione uma versão da documentação:

Este documento descreve os erros que pode encontrar quando gera um índice ScaNN. Também são fornecidos exemplos de erros e correções recomendadas.

Lista de erros

Segue-se uma lista de erros gerados quando tenta criar um índice ScaNN. Pode desativar a geração destes erros e continuar a gerar o índice. Para mais informações, consulte o artigo Aplique a criação de índices e suprima erros.

ERRO: não é possível criar um índice ScaNN com uma tabela vazia

Mensagem de erro

Quando tenta gerar um índice numa tabela sem dados ou tenta truncar uma tabela com um índice ScaNN gerado na mesma, ocorre o seguinte erro:

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 exemplo 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;
    

Certifique-se de que a tabela está preenchida com vetores de incorporação antes de gerar um índice ScaNN.

ERRO: não é possível criar o índice ScaNN

Mensagem de erro

Quando tenta gerar um índice numa tabela com poucas linhas preenchidas, ocorre o seguinte erro:

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

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');

Certifique-se de que a tabela está preenchida com vetores de incorporação antes de gerar um índice ScaNN. Recomendamos que o número de linhas na tabela seja superior ao valor definido no parâmetro num_leaves.

ERRO: não é possível criar o índice ScaNN na tabela de partição principal.

Mensagem de erro

Se tiver criado tabelas particionadas a partir de uma tabela principal, a criação de um índice ScaNN na tabela principal gera o seguinte erro:

ERROR: Cannot create ScaNN index on parent partition table. 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');

Não pode gerar um índice ScaNN na tabela principal de uma tabela particionada. Tem de gerar os índices ScaNN na tabela particionada.

Aplique a criação de índices e suprima erros

Pode aplicar o AlloyDB para gerar um índice e suprimir erros. Antes de permitir a geração de índices com este método, considere as seguintes implicações:

  • Uma vez que o índice é preparado com poucos ou nenhuns dados, os centroides aprendem com zero dados, o que resulta numa má capacidade de memorização.
  • O desempenho de gravação na base de dados também pode ser lento.

Para forçar a geração do índice, conclua o seguinte:

  1. Defina o parâmetro ao nível da sessão scann.allow_blocked_operations creation como true na base de dados:

    SET scann.allow_blocked_operations = true;
    
  2. Atribua o privilégio SUPERUSER ao utilizador que vai executar estas consultas na base de dados:

    CREATE USER USER_NAME WITH SUPERUSER PASSWORD PASSWORD;
    

    Substitua o seguinte:

    • USER_NAME: o nome do utilizador ao qual quer conceder o privilégio.
    • PASSWORD: a palavra-passe do utilizador.