无法使用空表创建 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 索引之前,请确保您的表已填充嵌入向量。所需的行数取决于索引创建模式:
- 对于
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 索引中的步骤绕过此验证。