ScaNN インデックス エラーのトラブルシューティング

このドキュメントでは、ScaNN インデックスの生成時に発生する可能性のあるエラーについて説明します。エラーの例と推奨される修正方法も提供されます。

エラーのリスト

ScaNN インデックスの作成時に生成されるエラーのリストは次のとおりです。これらのエラーの生成を無効にして、インデックスの生成を続行できます。詳細については、インデックスの作成を適用してエラーを抑制するをご覧ください。

ERROR: 空のテーブルで ScaNN インデックスを作成できません

エラー メッセージ

データのないテーブルにインデックスを生成しようとすると、または ScaNN インデックスが生成されたテーブルを切り捨てようとすると、次のエラーが発生します。

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

エラーを引き起こすクエリの例

  • クエリ例 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');
    
  • クエリ例 B

    truncate t1;
    

ScaNN インデックスを生成する前に、テーブルにエンベディング ベクトルが入力されていることを確認してください。

ERROR: ScaNN インデックスを作成できません

エラー メッセージ

行数が少ないテーブルにインデックスを生成しようとすると、次のエラーが発生します。

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

エラーを引き起こすクエリの例

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

ScaNN インデックスを生成する前に、テーブルにエンベディング ベクトルが入力されていることを確認してください。テーブルの行数は、num_leaves パラメータで定義された値よりも大きくすることをおすすめします。

ERROR: 親パーティション テーブルに ScaNN インデックスを作成できません。

エラー メッセージ

親テーブルからパーティション分割テーブルを作成した場合、親テーブルに ScaNN インデックスを作成すると、次のエラーが発生します。

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

エラーを引き起こすクエリの例

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

パーティション分割テーブルの親テーブルに ScaNN インデックスを生成することはできません。パーティション分割テーブルに ScaNN インデックスを生成する必要があります。

インデックスの作成を適用し、エラーを抑制する

AlloyDB にインデックスの生成を強制し、エラーを抑制できます。この方法でインデックスの生成を許可する前に、次の影響を考慮してください。

  • インデックスは少量のデータまたはデータなしでトレーニングされるため、重心はゼロのデータで学習され、低いレジュールにつながります。
  • データベースへの書き込みパフォーマンスも低下する可能性があります。

インデックスの生成を強制するには、次の操作を行います。

  1. データベースで scann.allow_blocked_operations creation セッション レベルのパラメータを true に設定します。

    SET scann.allow_blocked_operations = true;
    
  2. データベースでこれらのクエリを実行するユーザーに SUPERUSER 権限を割り当てます。

    CREATE USER USER_NAME WITH SUPERUSER PASSWORD PASSWORD;
    

    次のように置き換えます。

    • USER_NAME: 権限を付与するユーザーの名前。
    • PASSWORD: ユーザーのパスワード。