优化自连接到自引用列
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';
这将 运行 四个查询,但它们可以有效地使用索引,如果您在连接条件上有索引,您最终可能会更快。
我正在尝试连接两个 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';
这将 运行 四个查询,但它们可以有效地使用索引,如果您在连接条件上有索引,您最终可能会更快。