排解 ScaNN 索引錯誤

本文說明產生 ScaNN 索引時可能發生的錯誤。並提供錯誤範例和建議的修正方式。

錯誤清單

以下列出嘗試建立 ScaNN 索引時產生的錯誤。您可以停用這些錯誤的產生作業,並繼續產生索引。詳情請參閱「強制建立索引並抑制錯誤」。

錯誤:無法使用空白資料表建立 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 索引。

錯誤:無法建立 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 參數中定義的值。

錯誤:無法在父項分區資料表上建立 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:使用者密碼。