【发布时间】:2020-12-03 06:02:32
【问题描述】:
对于我们的 Teiid Springboot 项目,我们在 where 子句中使用行过滤器来确定用户获得的结果。 示例:
SELECT * FROM very_large_table WHERE id IN ('01', '03')
我们希望 IN 子句中的上下文是动态的,如下所示:
SELECT * FROM very_large_table WHERE id IN (SELECT other_id from very_small_table)
现在的问题是 Teiid 从very_large_table 获取所有数据,然后才尝试使用 where 子句进行过滤,这使得查询速度慢了 10-20 倍。这个very_small_table中的数据只有大约1-10条记录,它是基于我们从Java获得的用户上下文。
very_large_table 位于 Oracle 数据库上,very_small_table 位于 Teiid Pod/Container 上。不知何故,我无法强制 Teiid 将数据发送到 Oracle 并在那里执行过滤。
我尝试过的事情: 我已经指定了如下的外部数据包装器
CREATE FOREING DATA WRAPPER "oracle_override" TYPE "oracle" OPTIONS (EnableDependentsJoins 'true');
CREATE SERVER server_name FOREIGN DATA WRAPPER "oracle_override";
我也尝试过,exists 语句或代替 where 子句使用 join 子句来查看是否发生下推。此外,连接提示似乎并不重要。
遗憾的是,目前对性能的影响如此之大,以至于我们无法达到我们的性能目标。
【问题讨论】: