Résoudre les erreurs d'indexation ScaNN

Ce document décrit les erreurs que vous pouvez rencontrer lorsque vous générez un indice ScaNN. Des exemples d'erreurs et des corrections recommandées sont également fournis.

Liste des erreurs

Vous trouverez ci-dessous la liste des erreurs générées lorsque vous essayez de créer un indice ScaNN. Vous pouvez désactiver la génération de ces erreurs et continuer à générer l'index. Pour en savoir plus, consultez Forcer la création d'index et supprimer les erreurs.

ERREUR: Impossible de créer un index ScaNN avec une table vide

Message d'erreur

Lorsque vous essayez de générer un indice sur une table sans données ou de tronquer une table avec un indice ScaNN généré dessus, l'erreur suivante se produit:

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

Exemples de requêtes à l'origine de l'erreur

  • Exemple de requête 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');
    
  • Exemple de requête B

    truncate t1;
    

Assurez-vous que votre table est renseignée avec des vecteurs d'encapsulation avant de générer un indice ScaNN.

ERREUR: Impossible de créer l'index ScaNN

Message d'erreur

Lorsque vous essayez de générer un indice sur une table avec peu de lignes renseignées, l'erreur suivante se produit:

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

Exemple de requête à l'origine de l'erreur

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

Assurez-vous que votre table est renseignée avec des vecteurs d'encapsulation avant de générer un indice ScaNN. Nous vous recommandons que le nombre de lignes du tableau soit supérieur à la valeur définie dans le paramètre num_leaves.

ERREUR: Impossible de créer un index ScaNN sur la table de partition parente.

Message d'erreur

Si vous avez créé des tables partitionnées à partir d'une table parente, la création d'un index ScaNN sur la table parente génère l'erreur suivante:

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

Exemple de requête à l'origine de l'erreur

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

Vous ne pouvez pas générer d'index ScaNN sur la table parente d'une table partitionnée. Vous devez générer les index ScaNN sur la table partitionnée.

Forcer la création d'index et supprimer les erreurs

Vous pouvez forcer AlloyDB à générer un indice et à supprimer les erreurs. Avant d'autoriser la génération d'index avec cette méthode, tenez compte des implications suivantes:

  • Étant donné que l'indice est entraîné sur moins de données ou sur aucune, les centroïdes apprennent sur zéro données, ce qui entraîne un mauvais rappel.
  • Les performances d'écriture dans la base de données peuvent également être lentes.

Pour forcer la génération d'index, procédez comme suit:

  1. Définissez le paramètre scann.allow_blocked_operations creation au niveau de la session sur true dans la base de données:

    SET scann.allow_blocked_operations = true;
    
  2. Attribuez le droit SUPERUSER à l'utilisateur qui exécutera ces requêtes sur la base de données:

    CREATE USER USER_NAME WITH SUPERUSER PASSWORD PASSWORD;
    

    Remplacez les éléments suivants :

    • USER_NAME: nom de l'utilisateur auquel vous souhaitez accorder le privilège.
    • PASSWORD: mot de passe de l'utilisateur.