本文說明產生 ScaNN 索引時可能會遇到的錯誤。同時提供錯誤範例和建議的修正方式。
一般而言,您可以停用這些錯誤的產生作業,並繼續產生索引。詳情請參閱「強制在空白或小型資料表上建立索引」。
無法使用空白資料表建立 ScaNN 索引
說明
如果您嘗試在沒有資料的資料表上產生索引,或是嘗試截斷已產生 ScaNN 索引的資料表,就會發生下列錯誤:
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.
導致錯誤的查詢範例
查詢範例 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 索引
說明
嘗試在資料列數不多的資料表上產生索引時,會發生下列錯誤:
ERROR: Cannot create ScaNN index "[INDEX_NAME]" for table "[TABLE_NAME]", error: INVALID_ARGUMENT: Number of rows ([ACTUAL]) must be larger than ([EXPECTED]).
導致錯誤的查詢範例
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 (以及 IVFFlat 等大多數 ANN 索引) 需要訓練集來建構內部結構 (叢集/葉節點)。插入剛好一列時,會收到下列錯誤訊息:
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]"
導致錯誤的查詢範例
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');
建議修正方式
請先確認資料表已填入嵌入向量,再產生 ScaNN 索引。建議資料表中的資料列數如下:
- 大於 1
- 大於
num_leaves參數中定義的值
無法在父項分區資料表上建立 ScaNN 索引
說明
如果您是從父項資料表建立分區資料表,在父項資料表上建立 ScaNN 索引時,會產生下列錯誤:
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.
導致錯誤的查詢範例
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索引。