不使用 pgvector (HNSW) 索引的 SELECT 查询

问题描述 投票:0回答:1

给定一个大约100万的表。具有整数类型的列

id
和向量类型的
embedding
的行(2000),我在 pgAdmin 查询工具中运行了以下查询:

CREATE INDEX ON table USING hnsw (embedding vector_cosine_ops);

无论我运行什么 SELECT 查询,在使用

EXPLAIN ANALYZE
作为查询前缀时,我都没有看到正在使用的索引。

看到@ankane的评论“按表达式排序[...]不会使用索引”和“Postgres仅支持对运算符进行ASC顺序索引扫描”,我尝试了一个简单的

SELECT id, embedding <=> $1 FROM table
,但它仍然不使用索引。

许多博客文章如this GCP onethis other one建议使用

EXPLAIN
来检查是否使用了索引。

因此我提出以下问题:

  • 如何检查索引是否真正建立?通过
    EXPLAIN
    ,我可以看到即使是最简单的查询也不会使用索引,因此我什至想知道索引是否实际上已创建(尽管
    CREATE INDEX
    已“在 1 小时 6 分钟内成功返回。”)
  • 如何通过
    SELECT
    语句使用 HNSW 索引?
  • 假设已创建索引,如果我重新运行
    CREATE INDEX
    语句会发生什么?如果我创建一个 HNSW 索引,我假设它会覆盖现有索引(是吗?),如果我创建一个
    IVFFLAT
    索引,它会覆盖现有索引吗?
postgresql indexing embedding vector-database pgvector
1个回答
0
投票

我相信您的问题可能是因为您没有将 ORDER BY 与 LIMIT 一起使用。 在查询部分下面有这个注释...

注意:结合 ORDER BY 和 LIMIT 使用索引

pgvector 查询自述文件

© www.soinside.com 2019 - 2024. All rights reserved.