排查 ScaNN 索引错误

选择文档版本:

本文档介绍了在生成 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 索引

说明

当您尝试在填充了少量行的表上生成索引时,会发生以下错误:

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 索引之前,请确保您的表已填充嵌入向量。所需的行数取决于索引创建模式:
    • 对于 AUTO 模式,我们建议至少 10,000 行。
    • 对于 MANUAL 模式,我们建议表中的行数大于 num_leaves 参数中定义的值。
  • 如需在行数不足的表上创建索引,您可以启用延迟索引创建。如需了解详情,请参阅 为空表或接近空表的表创建延迟索引

无法为仅包含一行的表创建 ScaNN 索引

说明

之所以出现此错误,是因为 ScaNN(以及大多数 ANN 索引,例如 IVFFlat)需要训练集来构建其内部结构(集群/叶)。当您插入正好一行时,会收到以下错误:

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 参数中定义的值

无法为行数少于 1 万的表创建自动调整的 ScaNN 索引

说明

当您尝试在行数少于 1 万的表上创建 自动调整的 ScaNN 索引时,会发生此错误。当您尝试这样做时,会收到以下错误:

"ERROR: Cannot create ScaNN index "products_embedding_idx" for table "products", error: FAILED_PRECONDITION: Number of rows: 100 must be 10000 or more."

导致错误的查询示例

CREATE INDEX product_index ON product
USING scann (embedding cosine)

在尝试创建自动调整的 ScaNN 索引之前,请确保您的表至少有 1 万行。如果您需要出于 开发或测试目的而替换此限制,请参阅 在空表或小型表上强制创建索引

无法在父分区表上创建 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 索引。
  • 尝试按照创建 ScaNN 索引中的步骤绕过此验证。