oceanbase 向量数据库 查询时,谓词条件中同时出现 向量和标量 ,此时过滤的先后顺序是什么?

oceanbase 向量数据库 查询时,谓词条件中同时出现 向量和标量 ,此时过滤的先后顺序是什么?
1、先向量后标量?
2、能否指定谓词执行的先后顺序呢?

谓词的执行顺序通常由数据库的查询优化器决定,它会根据统计信息和成本估算来选择最优的执行计划。

如果需要控制谓词执行的顺序,可以考虑以下两种方法:

  1. 使用子查询:通过将一部分谓词放在子查询中,可以间接控制谓词的执行顺序。例如,先在一个子查询中应用向量相关的过滤条件,然后再在外层查询中应用标量的过滤条件。
    SELECT *
    FROM (
    SELECT *
    FROM table_name
    WHERE vector_condition
    ) AS subquery
    WHERE scalar_condition;

  2. 使用 Hint:可以尝试使用其他 Hint 来影响查询计划,例如 /*+ LEADING / 或 /+ INDEX */ 等,以达到控制执行顺序的目的。

背景是这样的:

假设有这样的一个场景:前置标量过滤,就是先指定某个用户uid的数据里面再用特征向量搜索。

但是看了向量数据库的标量过滤主要是后置过滤,就是先按向量搜索了结果再通过标量来过滤数据返回。

所以 是不是可以这样理解? 如果数据库底层分片的向量数据库(按标量分片分区的),是不是都是标量前置搜索呢?

标量过滤后置,向量索引是全局的,并不能按照某个标量划分之后再建向量索引。可能会出现标量过滤之后搜索不出数据的问题。


CREATE TABLE t1(
    c1 INT, 
    c2 VECTOR(3), 
    PRIMARY KEY(c1), 
    VECTOR INDEX idx1(c2) WITH (distance=L2, type=hnsw)
    );
INSERT INTO t1 VALUES(1, '[0.203846, 0.205289, 0.880265]');
INSERT INTO t1 VALUES(2, '[0.735541, 0.670776, 0.903237]');
INSERT INTO t1 VALUES(3, '[0.327936, 0.048756, 0.084670]');

--------------------------------------------------
查询结果返回一行:


--------------------------------------------------
查询结果返回三行:

--------------------------------------------------

--------------------------------------------------

而如下语句查询是空,但是我的意思想查询c1为1或者2的,如上,理论上也会有返回才对(c1=2的记录)。但是这样好像有维度切割。

SELECT * from t1 where c1 in (1,2) ORDER BY l2_distance(c2, [0.712338, 0.603321, 0.133444]) APPROXIMATE LIMIT 1;

不知道 这个场景是不是在向量查询中 是不允许的?就是想标量前置过滤。

我咨询下这块的老师,有进展会尽快回复你

当前需要扩大limit数量,pre-filter可以解决这个问题,在435bp1会解决这个问题

例如:
obclient [test]> SELECT * from t1 where c1 in (1,2) ORDER BY l2_distance(c2, [0.712338, 0.603321, 0.133444]) APPROXIMATE LIMIT 2;
±—±-----------------------------+
| c1 | c2 |
±—±-----------------------------+
| 2 | [0.735541,0.670776,0.903237] |
±—±-----------------------------+
1 row in set (0.008 sec)

这个case是知道c1=2后,才 APPROXIMATE LIMIT 2 查询出想要的结果,是一个预设场景,但是在实际开发中,这个预设场景是不可能存在的。

这里是在435bp1内测环境查询的,435bp1会解决这个问题