优化自连接到自引用列

Optimization on a self-join to a self-reference column

我正在尝试连接两个 table,出于示例目的,我将调用第一个 table 'fund',第二个 table [=32] =].

基金 table 持有与公司子集相关的基金信息。然而,基金 table 仅存储单个公司(母公司)的 ID:

公司 table 由有关公司的信息行组成,包括来自我需要搜索的外部系统的标识符。公司可以通过自引用列与另一家公司相关联,该列通过规则集仅允许一个层次结构。

从数据库中获取信息的请求将始终带有一个外部密钥,这可以属于子公司(子)或母公司实体。目标是找到与公司相关的所有子实体和父实体,以及加入基金 table 以获取更多信息。

由于请求量大,需要优化。目前我是 运行 以下查询,该查询有效但由于多个 OR 过滤器而显得昂贵:

SELECT * FROM fund
    JOIN company AS csearch ON (csearch.companycompositekey = fund.companycompositekey OR csearch.parentcompositekey = fund.companycompositekey)
    JOIN company ON (company.companycompositekey = fund.companycompositekey OR company.parentcompositekey = fund.companycompositekey)
WHERE csearch.externalkey = '997'

我的 SQL 技能很糟糕所以我想知道我是不是完全看错了? 'WITH RECURSIVE (...select for the parent) JOIN fund JOIN children' 会是更好的方法吗?还有别的吗?

是否也可以通过在 JOIN 上调用 LIMIT 1 来优化 'externalkey' 上的过滤器(它始终是唯一的)?

尝试将 OR 替换为所有可能组合的 UNION

SELECT * FROM fund
   JOIN company AS csearch ON csearch.companycompositekey = fund.companycompositekey 
   JOIN company ON company.companycompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
   JOIN company AS csearch ON csearch.companycompositekey = fund.companycompositekey
   JOIN company ON company.parentcompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
   JOIN company AS csearch ON csearch.parentcompositekey = fund.companycompositekey
   JOIN company ON company.companycompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
   JOIN company AS csearch ON csearch.parentcompositekey = fund.companycompositekey
   JOIN company ON company.parentcompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997';

这将 运行 四个查询,但它们可以有效地使用索引,如果您在连接条件上有索引,您最终可能会更快。