Fehler bei ScaNN-Index beheben

In diesem Dokument werden Fehler beschrieben, die beim Generieren eines ScaNN-Index auftreten können. Außerdem finden Sie Beispiele für Fehler und empfohlene Korrekturen.

Als allgemeine Problemumgehung können Sie die Generierung dieser Fehler deaktivieren und den Index weiterhin generieren. Weitere Informationen finden Sie unter Indexerstellung für leere oder kleine Tabellen erzwingen.

ScaNN-Index kann nicht mit leerer Tabelle erstellt werden

Beschreibung

Wenn Sie versuchen, einen Index für eine Tabelle ohne Daten zu generieren, oder wenn Sie versuchen, eine Tabelle zu kürzen, für die ein ScaNN-Index generiert wurde, tritt der folgende Fehler auf:

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.

Beispielabfragen, die den Fehler verursachen

  • Beispielabfrage 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');
    
  • Beispielabfrage B

    truncate t1;
    

Achten Sie darauf, dass Ihre Tabelle mit Einbettungsvektoren gefüllt ist, bevor Sie einen ScaNN-Index generieren.

ScaNN-Index kann nicht erstellt werden

Beschreibung

Wenn Sie versuchen, einen Index für eine Tabelle mit wenigen Zeilen zu erstellen, tritt der folgende Fehler auf:

ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: INVALID_ARGUMENT: Number of rows ([ACTUAL]) must be larger than ([EXPECTED]).

Beispielabfrage, die den Fehler verursacht

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

Achten Sie darauf, dass Ihre Tabelle mit Einbettungsvektoren gefüllt ist, bevor Sie einen ScaNN-Index generieren. Wir empfehlen, dass die Anzahl der Zeilen in der Tabelle größer als der im Parameter num_leaves definierte Wert ist.

ScaNN-Index kann nicht für eine Tabelle mit nur einer Zeile erstellt werden

Beschreibung

Dieser Fehler ist aufgetreten, weil für ScaNN (und die meisten ANN-Indizes wie IVFFlat) ein Trainingsset zum Erstellen der internen Strukturen (Cluster/Blätter) erforderlich ist. Wenn Sie genau eine Zeile einfügen , wird der folgende Fehler angezeigt:

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]"

Beispielabfrage, die den Fehler verursacht

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

Achten Sie darauf, dass Ihre Tabelle mit Einbettungsvektoren gefüllt ist, bevor Sie einen ScaNN-Index generieren. Wir empfehlen, dass die Anzahl der Zeilen in der Tabelle so hoch ist:

  • Größer als 1
  • Größer als der im Parameter num_leaves definierte Wert

ScaNN-Index kann nicht für die übergeordnete Partitionstabelle erstellt werden

Beschreibung

Wenn Sie partitionierte Tabellen aus einer übergeordneten Tabelle erstellt haben, wird beim Erstellen eines ScaNN-Index für die übergeordnete Tabelle der folgende Fehler generiert:

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.

Beispielabfrage, die den Fehler verursacht

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');
  • Sie können keinen ScaNN-Index für die übergeordnete Tabelle einer partitionierten Tabelle erstellen.
  • Sie müssen die ScaNN-Indizes für die partitionierte Tabelle generieren.