【发布时间】:2021-11-18 21:50:27
【问题描述】:
我想知道 Postgres 是否支持针对以下基本问题进行优化。
我想在通过外键连接的不同表上搜索两列。我为每一列创建了一个索引。如果我进行联接查询并且对其中一列或另一列有 where 条件,则使用相应的索引来过滤结果,并且查询性能很好。如果对每个表的一个字段使用两个由 OR 组合的 where 子句,则查询会变得非常慢并且不使用索引。这大概是因为优化器认为除了执行全表连接和扫描来解决之外别无他法。查询看起来像这样:
select table1.id
from table1
left join table2 on table1.fk = table2.id
where table1.haystack ilike '%needle%' or table2.haystack ilike '%needle%'
操作 (ilike) 不是问题并且可以互换,我有一个有效的 Trigram 索引设置。我只是想知道除了将所有搜索字段非规范化到一个表中之外,是否还有其他方法可以使这种类型的查询高效。
如果有任何想法,我都会非常感激。
【问题讨论】:
-
不相关,但是:您的 WHERE 子句有效地将外部联接转换回内部联接
-
一个基本的解决方案是在两个查询之间做一个
UNION ALL,每个查询只在一列上有一个where条件 -
@a_horse_with_no_name :你能解释一下为什么 where 子句将外连接变成内连接吗?谢谢。
标签: postgresql